Spring Data Cassandra 和 PreparedStatementCache

Posted

技术标签:

【中文标题】Spring Data Cassandra 和 PreparedStatementCache【英文标题】:Spring Data Cassandra and PreparedStatementCache 【发布时间】:2020-01-19 02:39:56 【问题描述】:

我不明白如何使用 Spring Data Cassandra 实现非常简单的目标。

我想使用不同的参数值多次执行“INSERT”语句。我暂时没有映射域类,所以我使用Spring Data提供的CqlOperations接口。

当我只使用execute(String cql, Object... args) 时,Cassandra 驱动程序抱怨“重新准备已经准备好的查询通常是一种反模式,可能会影响性能。考虑只准备一次语句”。因为 Spring Data 使用SimplePreparedStatementCreator。但我看不出有任何方法可以告诉 Spring Data 使用CachedPreparedStatementCreator。我看到的只是execute(PreparedStatementCreator psc) 方法,它不允许我提供参数值。

那么,有没有办法告诉 Spring Data 使用正确的语句缓存或实现类似于 execute(PreparedStatementCreator, Object...) 的东西?

【问题讨论】:

【参考方案1】:

CqlTemplate 公开了回调和自定义钩子,允许根据您的应用程序的需要定制其某些功能。

CqlTemplate 确实故意没有缓存,因为缓存会导致时间与空间的考虑。 Spring Data Cassandra 无法做出决定,因为我们无法假设应用程序通常需要什么。

Spring Data Cassandra 的包 core.cql.support 附带了对 CachedPreparedStatementCreator 的支持,以及可用于此目的的 PreparedStatementCache

子类CqlTemplate 并覆盖其newPreparedStatementCreator(…) 方法以指定使用哪个PreparedStatementCreator。以下示例显示了具有无限保留的缓存示例:

public class MyCachedCqlTemplate extends CqlTemplate 

    PreparedStatementCache cache = MapPreparedStatementCache.create();

    @Override
    protected PreparedStatementCreator newPreparedStatementCreator(String cql) 
        return CachedPreparedStatementCreator.of(cache, cql);
    


【讨论】:

Cassandra 驱动程序 4.0+ 没有记录警告 - the session has a built-in cache, it’s OK to prepare the same string twice. docs.datastax.com/en/developer/java-driver/4.7/manual/core/…

以上是关于Spring Data Cassandra 和 PreparedStatementCache的主要内容,如果未能解决你的问题,请参考以下文章

带有 Spring Data 和 Cassandra @Query 的 IN 子句

Spring Boot 和 Spring Data with Cassandra:在数据库连接失败时继续

如何在Spring Boot和Spring Data中使用两个Cassandra数据源?

Spring Data Cassandra:“用户类型没有属性 findAll”

Spring Boot 1.4:Spring Data Cassandra 1.4.2 与 Cassandra 3.0 不兼容?

具有响应式Cassandra 的Spring Data