Spring Cassandra是CachedPreparedStatementCreator类线程安全吗?

时间:2016-01-24 18:48:08

标签: java spring cassandra datastax

我们使用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");

        }

这门课的意图是什么?它的目的是线程安全吗?任何人都可以获得有关此缓存性能的任何信息吗?

1 个答案:

答案 0 :(得分:0)

在检查语句存在和创建新的预准备语句之间肯定存在竞争条件。我会寻求类似于ReentrantReadWriteLock文档中的解决方案。

请注意,在实现写锁定后,验证该值仍然不存在。这将解决你在这里看到的情况。

考虑在Spring Data Cassandra JIRA中提交票证或在Github上提交公关。