优化Java Cassandra PreparedStatementCache

时间:2019-03-28 14:08:26

标签: java cassandra

我使用org.springframework.data.cassandra.core.cql.support.PreparedStatementCache来缓存prepareStatement。 但是,这需要很多内存。 看起来如果我仍然使用PreparedStatement,则缓存永远不会清理,并且会增加(尽管我们使用相同的cql查询!!!)。 如果我停止给他打电话,记忆将会减少。

我的应用程序使用springboot / cassandra dse 我们俩都在tomcat(Windows和Linux服务器,超过500 req / s)中进行测试。

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

是否有任何提高性能的建议(与使应用程序缓存和方法级别无关)? 我们如何确定这个prepareStatementCache的大小?

非常感谢。

1 个答案:

答案 0 :(得分:1)

不要为每个idChannel做准备的语句。创建单个准备好的语句并绑定ID,就不必为每个查询创建一个新的语句(这非常昂贵)。喜欢

  return CachedPreparedStatementCreator.of(
          cache,
          select()
              .all()
              .from("channel")
              .where(eq("idchannel", bindMarker("idchannel")))
      .createPreparedStatement(session)
      .bind()
      .setString("idchannel", idchannel));