我们使用Spring Cassandra和datastax驱动程序使用CachedPreparedStatementCreator / PreparedStatement向Cassandra发出请求。在启动时,这些WARN消息显示在日志文件中(还有其他消息,这只是一个示例)
:WARN lg:com.datastax.driver.core.Cluster - 重新准备已准备好的查询插入到活动(id)值(?)USING TTL ?.请注意,多次准备相同的查询通常是反模式,可能会影响性能。考虑只准备一次声明。
使用CachedPreparedStatementCreator类创建预准备语句。查看源代码,似乎存在“竞争条件”,并且实现不是线程安全的。
Map<String, PreparedStatement> sessionMap = psMap.get(session);
if (sessionMap == null) {
sessionMap = new ConcurrentHashMap<String, PreparedStatement>();
psMap.put(session, sessionMap);
}
PreparedStatement pstmt = sessionMap.get(keyspaceCQLKey.toString());
if (pstmt == null) {
log.debug("No Cached PreparedStatement found...Creating and Caching");
pstmt = session.prepare(this.cql);
sessionMap.put(keyspaceCQLKey.toString(), pstmt);
} else {
log.debug("Found cached PreparedStatement");
}
这门课的意图是什么?它的目的是线程安全吗?任何人都可以获得有关此缓存性能的任何信息吗?
答案 0 :(得分:0)
在检查语句存在和创建新的预准备语句之间肯定存在竞争条件。我会寻求类似于ReentrantReadWriteLock文档中的解决方案。
请注意,在实现写锁定后,验证该值仍然不存在。这将解决你在这里看到的情况。
考虑在Spring Data Cassandra JIRA中提交票证或在Github上提交公关。