- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
private Map<String, PreparedStatement> statements = new ConcurrentHashMap<>();
public PreparedStatement prepare(String cql) {
cql = cql.toLowerCase();
synchronized (cql.intern()) {
if (!statements.containsKey(cql)) {
PreparedStatement statement = session.prepare(cql);
statements.put(cql, statement);
}
}
return statements.get(cql);
}
Dummy00001 17.03.2017 17:57 # 0
ASD_77 17.03.2017 18:38 # 0
barop 17.03.2017 18:44 # 0
roman-kashitsyn 17.03.2017 19:26 # 0
Нет.
barop 17.03.2017 20:01 # 0
с ConcurrentSkipListMap перепутал
Dummy00001 17.03.2017 18:59 # +1
barop 17.03.2017 19:26 # 0
Dummy00001 17.03.2017 19:31 # 0
PS
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#computeIfAbsent-K-java.util.function.Function-
но как здесь описывается, то вроде бы чтение из мапа не будет заблокировано - только запись в мап. не совсем желательно - но часто это достаточно.
jericho 18.03.2017 18:55 # 0
Исходники у этого метода, канеш, вырви глаз, но мапа полностью не лочится. Здесь как и везде в конкаррент мапе есть а ля бакеты, которые вычисляются для каждой строки cql. То есть в случае коллизий будет лочиться только один бакет.
jericho 18.03.2017 19:02 # 0
Шо это за слово такое? :)
roman-kashitsyn 17.03.2017 19:33 # +1
А кто сказал, что session.prepare(cql); потокобезопасен?
Тут смех скорее не в блокировках, а в том, как происходит инвалидация кэша.
Что происходит с PreparedStatement, когда сессия закрывается?
Кто удаляет старые записи из кэша?
Dummy00001 17.03.2017 19:41 # 0
"Java uses garbage collection, thus there are no memory leak by design. You simply need to install more RAM on your servers."
roman-kashitsyn 17.03.2017 19:55 # 0
roman-kashitsyn 17.03.2017 20:11 # 0
Что-то я и сам затупил. Лок тут используется не для того, чтобы защитить session, и не для того, чтобы защитить мапу.
Он тут используется для того, чтобы не подготавливать один и тот же запрос дважды.
Осталось проверить, является ли session потокобезопасным.
jericho 18.03.2017 18:32 # 0
jericho 18.03.2017 18:58 # 0
jericho 18.03.2017 19:04 # 0
jericho 18.03.2017 19:06 # 0
Сессия закрывается при остановке приложения. То есть все время жизни приложения PreparedStatement абсолютно валиден.
huesto 17.03.2017 20:59 # 0
Наконец-то за сайт взялись
а меня пронесло?