优化java cassandra preparedstatementcache

xfb7svmp  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(273)

我使用org.springframework.data.cassandra.core.cql.support.preparedstatementcache来缓存preparedstatement。但这需要很多记忆。看起来如果我仍然使用preparedstatement,缓存永远不会被清除,并且会增加(尽管我们使用相同的cql查询!!!)。如果我不给他打电话,记忆就会减退。
我的应用程序使用springboot/cassandradse,我们都在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();
    }

有没有提高性能的建议(不是让应用程序缓存达到方法级别)?如何修复此preparedstatementcache的大小?
谢谢。

polkgigr

polkgigr1#

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

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

相关问题