Java 带Insert的AsyncqlTemplate缓存准备语句
我使用的是spring数据cassandra 2.0.7.RELEASE,我很难弄清楚如何获得Java 带Insert的AsyncqlTemplate缓存准备语句,java,spring,performance,spring-boot,spring-data-cassandra,Java,Spring,Performance,Spring Boot,Spring Data Cassandra,我使用的是spring数据cassandra 2.0.7.RELEASE,我很难弄清楚如何获得缓存的预处理语句 以类似的方式,我使用CqlTemplate模板创建了一个PreparedStatementCache,并且能够创建一个缓存的prepared语句,如下所示: PreparedStatementCreator preparedStatementCreator = ...; PreparedStatementBinder binder
缓存的预处理语句
以类似的方式,我使用CqlTemplate模板创建了一个PreparedStatementCache
,并且能够创建一个缓存的prepared语句,如下所示:
PreparedStatementCreator preparedStatementCreator = ...;
PreparedStatementBinder binder = ...;
return selectCqlTemplate.query(preparedStatementCreator,
binder,
resultSetExtractor);
对于AsyncqlTemplate,我看到有一个AsyncPreparedStatementCreator
,但是如何创建其中一个还不是很清楚,因为唯一的实现是SimpleAsyncPreparedStatementCreator
,它是私有的
所以我的问题是,对于insert语句,使用AsyncqlTemplate并缓存预处理语句的最佳方式是什么?Spring Data for Apache Cassandra不提供内置的异步PreparedStatement
缓存。它只附带一个同步的(,)
实现异步缓存需要在同步和避免重复的prepare调用方面做出一些努力
一个简单的实现可以如下所示:
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;
}
}
公共类AsyncCachedPreparedStatementCreator实现AsyncPreparedStatementCreator、CqlProvider{
私有最终字符串cql;
私有最终映射缓存=新ConcurrentHashMap();
公共AsyncCachedPreparedStatementCreator(字符串cql){
this.cql=cql;
}
@凌驾
public ListenableFuture createPreparedStatement(会话会话)引发DriverException{
com.google.common.util.concurrent.ListenableFuture=cache.computeIfAbsent(会话,
s->s.prepareAsync(cql));
返回新的GuavaListenableFutureAdapter(future,new CassandraExceptionTranslator());
}
@凌驾
公共字符串getCql(){
返回cql;
}
}
此实现假定每个会话都有一个缓存,并将其缓存保存在一个ConcurrentHashMap
谢谢,我想我只是惊讶于缓存的异步语句没有一个简单的实现。我将继续在spring boot cassandra中为此创建一个特性,因为我认为在模块中包含一个简单的实现可能是一个好主意。