有人可以帮忙吗?垃圾收集器未收集这些映射器对象,并且堆可用空间没有减少。
com.datastax.driver.mapping.Mapper类对象在堆内存中创建。我已经在使用映射器的地方给出了代码,这只在整个应用程序中放置。
代码:
public RawPlan retrievePrePPlan(PlanCompleteTrigger planCompleteTrigger) {
Mapper<PrePPlan> mapper = new MappingManager(session).mapper(PrePPlan.class);
//TODO Replace Select all with individual column names
Select select = QueryBuilder.select().all().from(CassandraTableConstants.PRE_P_PLAN);
select.where(QueryBuilder.eq("runuuid", planCompleteTrigger.getRunUUID()))
.and(QueryBuilder.eq("groupid", planCompleteTrigger.getGroupId()))
.and(QueryBuilder.eq("itemnbr", planCompleteTrigger.getItemNumber()))
.and(QueryBuilder.eq("sl", planCompleteTrigger.getSL()));
ResultSet resultSet = session.execute(select);
Result<PrePPlan> prePPlans = mapper.map(resultSet);
return new RawPlan(prePPlans.all());
}
您不正确地使用对象映射器-您仅将其用于将行映射到POJO中。您遇到以下问题-您正在使用QueryBuilder构建单个CQL查询,这导致以下问题-Cassandra需要分别接收和解析每个CQL语句-这严重损害了性能。您可以build the query with placeholders, prepare it和then bind parameters-这应该快得多。
但是实际上,您只需要正确使用对象映射器-如果您已经具有Mapper
实例,则可以选择以下选项:
mapper.get
, and other CRUD operationsmapper.get
。>这将使您的生活更加轻松,因为您无需构建查询-对象映射器将基于POJO注释在后台进行所有操作,然后通过准备它来优化查询执行,等等。
如果JVM中有可用内存,则Java垃圾收集器不能保证立即运行或删除所有无效对象。进行不必要的收集通常会降低应用程序的吞吐量或增加暂停时间。