带插入的AsyncCqlTemplate缓存的准备好的语句

时间:2018-08-24 12:28:23

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

我正在使用spring-data-cassandra 2.0.7.RELEASE,并且很难弄清楚如何获得cached准备好的语句。

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

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

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

对于AsyncCqlTemplate,我看到有一个AsyncPreparedStatementCreator,但是如何创建其中一个还不是很清楚,因为唯一的实现是私有的SimpleAsyncPreparedStatementCreator

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

1 个答案:

答案 0 :(得分:2)

Apache Cassandra的Spring数据不提供内置的异步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中。