当前位置: 首页 > 知识库问答 >
问题:

Spring Cassandra是CachedPreparedStatementCreator类threadsafe?

凤高翰
2023-03-14

我们正在使用Spring Cassandra和数据税驱动程序使用CachedPreparedStatementCreator/PreparedStatement向Cassandr发出请求。在启动时,这些WARN消息显示在日志文件中(还有其他消息,这只是一个例子)

:WARN LG:com . datas tax . driver . core . cluster-重新准备已经准备好的查询insert into active (id) values(?)用TTL?。请注意,多次准备同一个查询通常是一种反模式,可能会影响性能。考虑只准备一次语句。

预准备语句是使用高速缓存预语句创建器类创建的。查看源代码,似乎存在“争用条件”,并且实现不是线程安全的。

         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个答案

牧业
2023-03-14

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

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

考虑在Spring数据卡桑德拉JIRA中提交票证或在Github上提交PR。

 类似资料:
  • 如果我遇到静态编程语言类而不是泛型Java类,我想执行特殊功能。如何检测它是否是静态编程语言类? 我希望调用会引发异常或失败,如果类不是科特林。但它很好地包装了Java类。然后我注意到,如果我做,它似乎对所有java类的,即使它们有一个默认的构造函数,这是一个好的标记吗?但是,对于科特林类,这是否也返回值? 说“这是静态编程语言课吗?

  • 从Selenium文档来看,WebDriver是一个接口,但在Eclipse中是包在项目浏览器中显示为一个类。此外,如果WebDriver是一个接口,则实现它的类(如ChromeDriver或InternetExplorerDriver)应该定义或。我们在哪里可以看到这些方法的方法定义?

  • 我有这样的代码 现在,为了打印值,如果T是一个类,我想调用对象的打印函数,但是如果T是一个基本数据类型,我只想使用printf。 那么,如何确定模板类型是基本数据类型还是类?

  • 我对Kotlin是新来的,这是我的问题: 我使用android studio 3.2.1 kotlin版本:1.2.71 对此有什么想法吗?

  • 做对了"。事实证明,可以用来表示任何类似ListT-dod-right的东西。引用加布里埃尔·冈萨雷斯的话: 请注意,您可以仅使用变压器依赖项构建任何(不仅仅是管道中的那个)。例如,下面是如何实现: 这将在那里键入check作为any,并为所有人做正确的事情。 所以我的问题是:对于管道的消费者部分,是否有一个对偶到和到? 要求: 从不使用,只返回(或从不返回),但使用的管道可以表示为“双重到列表”

  • 通过上面的介绍,终于模模糊糊的带到元类这里来了。可是我们到现在还不知道元类是什么鬼东西。 我们创建类的时候,大多数是为了创建类的实例对象。 那么元类呢? 元类就是用来创建类的。也可以换个理解方式就是:元类就是类的类。 通过上面 type() 函数的介绍,我们知道可以通过 type() 函数创建类: MyClass = type('MyClass', (), {}) 实际上 type() 函数是一