java - AsyncCqlTemplate 缓存带插入的准备语句

标签 java spring performance spring-boot spring-data-cassandra

我正在使用 spring-data-cassandra 2.0.7.RELEASE,但我很难弄清楚如何获取缓存准备好的语句。

以类似的方式,我使用了 CqlTemplate 模板并创建了一个 PreparedStatementCache 并且能够创建一个缓存的准备好的语句,如下所示:

    PreparedStatementCreator preparedStatementCreator = ...;
    PreparedStatementBinder  binder                   = ...;

    return selectCqlTemplate.query(preparedStatementCreator,
                                   binder,
                                   resultSetExtractor);

对于 AsyncCqlTemplate,我看到有一个 AsyncPreparedStatementCreator,但不太清楚如何创建其中之一,因为唯一的实现是 SimpleAsyncPreparedStatementCreator,它是私有(private)的。

所以我的问题是,对于插入语句,使用 AsyncCqlTemplate 并拥有缓存的准备好的语句的最佳方法是什么?

最佳答案

Spring Data for Apache Cassandra 不提供内置异步 PreparedStatement 缓存。它仅附带一个同步同步( CachedPreparedStatementCreatorPreparedStatementCache )。

实现异步缓存需要在同步方面付出一些努力,并避免重复的准备调用。

一个简单的实现可能如下所示:

public class AsyncCachedPreparedStatementCreator implements AsyncPreparedStatementCreator, CqlProvider {

    private final String cql;

    private final Map<Session, com.google.common.util.concurrent.ListenableFuture<PreparedStatement>> cache = new ConcurrentHashMap<>();

    public AsyncCachedPreparedStatementCreator(String cql) {
        this.cql = cql;
    }

    @Override
    public ListenableFuture<PreparedStatement> createPreparedStatement(Session session) throws DriverException {

        com.google.common.util.concurrent.ListenableFuture<PreparedStatement> future = cache.computeIfAbsent(session,
                s -> s.prepareAsync(cql));

        return new GuavaListenableFutureAdapter<>(future, new CassandraExceptionTranslator());
    }

    @Override
    public String getCql() {
        return cql;
    }
}

此实现假定每个Session 缓存并将其缓存保存在ConcurrentHashMap 中。

关于java - AsyncCqlTemplate 缓存带插入的准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52004502/

相关文章:

javascript - 尝试理解 Javascript 闭包 + 内存泄漏

java - 在 Maven Checkstyle 插件报告中排除类

spring - 在 Kotlin 上添加 Spring Security 后测试 Spring Controller POST 方法

java - 使用 ehcache 时出错

c# - 在 C# 中读取 csv 文件以提高时间效率的最佳方法

java - 附加分析器是否会导致某些东西比其他东西运行得慢?

java - 如何仅从 URL 字符串中提取网站名称而不是 www.和 .com 与它

java - 与结果有差异吗?

java - 从带有空格的 java 脚本构建并执行 bash 脚本

java - 基于注释的配置层次结构