Ich arbeite mit Cassandra und Verwendung von Datastax Java-Treiber. Ich versuche, vorbereitete Anweisungen wiederzuverwenden, indem ich sie zwischenspeichere.Wie funktioniert "PutIfAbsent" in CHM?
private static final ConcurrentHashMap<String, PreparedStatement> holder = new ConcurrentHashMap<>();
public BoundStatement getStatement(String cql) {
Session session = TestUtils.getInstance().getSession();
PreparedStatement ps = holder.get(cql);
// no statement is cached, create one and cache it now.
if (ps == null) {
holder.putIfAbsent(cql, session.prepare(cql));
}
return ps.bind();
}
Prepared Statement und BoundStatement von DataStax Java-Treiber.
Diese getStatement
Methode wird von mehreren Threads aufgerufen, so dass ich sicherstellen muss, dass es threadsicher ist. Ich arbeite mit Java 7.
Was wird putIfAbsent
hier tun, wenn wir zwei gleiche cql vorbereitet Aussagen erhalten? Ist mein Code Thread sicher und es gibt keine Race Condition?
Update: -
public BoundStatement getStatement(String cql) {
Session session = TestUtils.getInstance().getSession();
PreparedStatement ps = holder.get(cql);
// no statement is cached, create one and cache it now.
if (ps == null) {
synchronized (this) {
ps = holder.get(cql);
if (ps == null) {
ps = session.prepare(cql);
holder.put(cql, ps);
}
}
}
return ps.bind();
}
Wie wäre es jetzt? Sieht es richtig aus? – john
Ja, das sieht gut aus. – Holger