我使用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的大小?
非常感谢。
答案 0 :(得分:1)
不要为每个idChannel做准备的语句。创建单个准备好的语句并绑定ID,就不必为每个查询创建一个新的语句(这非常昂贵)。喜欢
return CachedPreparedStatementCreator.of(
cache,
select()
.all()
.from("channel")
.where(eq("idchannel", bindMarker("idchannel")))
.createPreparedStatement(session)
.bind()
.setString("idchannel", idchannel));