Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带Insert的AsyncqlTemplate缓存准备语句_Java_Spring_Performance_Spring Boot_Spring Data Cassandra - Fatal编程技术网

Java 带Insert的AsyncqlTemplate缓存准备语句

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

我使用的是spring数据cassandra 2.0.7.RELEASE,我很难弄清楚如何获得
缓存的
预处理语句

以类似的方式,我使用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中为此创建一个特性,因为我认为在模块中包含一个简单的实现可能是一个好主意。