Кэшированный подготовленный оператор AsyncCqlTemplate с вставкой

Я использую spring-data-cassandra 2.0.7.RELEASE, и мне трудно понять, как получить подготовленный оператор cached.

Аналогичным образом я использовал шаблон CqlTemplate и создал PreparedStatementCache и могу создать кэшированный подготовленный оператор следующим образом:

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

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

Я вижу, что для AsyncCqlTemplate есть AsyncPreparedStatementCreator, но не очень ясно, как создать один из них, поскольку единственная реализация - SimpleAsyncPreparedStatementCreator, которая является частной.

Итак, мой вопрос: для оператора вставки, как лучше всего использовать AsyncCqlTemplate и иметь кешированный подготовленный оператор?


person Mike    schedule 24.08.2018    source источник


Ответы (1)


Spring Data для Apache Cassandra не предоставляет встроенный асинхронный PreparedStatement кеш. Он поставляется только с синхронным (_ 2_, _ 3_).

Реализация асинхронного кеша требует некоторых усилий с точки зрения синхронизации и предотвращения дублирования вызовов подготовки.

Простая реализация может выглядеть так:

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.

person mp911de    schedule 25.08.2018
comment
Спасибо, я думаю, я был просто удивлен, что нет простой реализации для кэшированного async-подготовленного оператора. Я продолжу и создам функцию для этого в Spring boot cassandra, поскольку я думаю, что простая реализация, включенная в модуль, вероятно, будет хорошей идеей. - person Mike; 29.08.2018