Оптимизация Java Cassandra PreparedStatementCache - PullRequest
0 голосов
/ 28 марта 2019

Я использую org.springframework.data.cassandra.core.cql.support.PreparedStatementCache для кэширования подготовленного состояния. Но это занимает много памяти. Похоже, если я все еще использую PreparedStatement, кэш никогда не очищается и увеличивается (несмотря на то, что мы используем тот же самый запрос cql !!!). Если я перестану звонить ему, память уменьшится.

Мое приложение использует springboot / cassandra dse Мы оба тестируем в tomcat (Windows и Linux-сервер, более 500 запросов / с).

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-cassandra</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.datastax.dse</groupId>
                    <artifactId>dse-java-driver-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>



private final PreparedStatementCache cache = PreparedStatementCache.create();

public Channel findByIdChannel(String idChannel) {

        List<Channel> listChannel = cassandraTemplate
                .getCqlOperations()
                .query(
                        findByIdChannelQuery(idChannel),
                        (row, rowNum) -> cassandraTemplate.getConverter().read(Channel.class, row));
        if (listChannel.isEmpty()) {
            return null;
        }
        return listChannel.get(0);
    }

    private BoundStatement findByIdChannelQuery(String idChannel) {
        String cql = "select * from channel where idchannel = '" + idChannel + "'";
        return CachedPreparedStatementCreator.of(
                cache, cql).createPreparedStatement(session)
                .bind();
    }

Любая рекомендация по повышению производительности (не о создании кеша приложений и уровне метода)? Как мы можем исправить размер подготовленного StateCache?

Большое спасибо.

1 Ответ

1 голос
/ 28 марта 2019

Не делайте подготовленное заявление для каждого idChannel. Создайте один подготовленный оператор и свяжите идентификатор вместо этого, и не нужно будет создавать новый для каждого запроса (что очень дорого). как

  return CachedPreparedStatementCreator.of(
          cache,
          select()
              .all()
              .from("channel")
              .where(eq("idchannel", bindMarker("idchannel")))
      .createPreparedStatement(session)
      .bind()
      .setString("idchannel", idchannel));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...