AsyncCqlTemplate подготовленный в кэш подготовленный оператор со вставкой - PullRequest
0 голосов
/ 24 августа 2018

Я использую 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 голосов
/ 25 августа 2018

Spring Data для Apache Cassandra не предоставляет встроенный асинхронный PreparedStatement кэш.Поставляется только с синхронным (CachedPreparedStatementCreator, PreparedStatementCache).

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

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

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;
    }
}

Эта реализация предполагает кэш на каждый 1015 * и хранит свой кеш в ConcurrentHashMap.

...