datastax映射器对象的垃圾收集问题

问题描述 投票:-3回答:1

有人可以帮忙吗?垃圾收集器未收集这些映射器对象,并且堆可用空间没有减少。

com.datastax.driver.mapping.Mapper类对象在堆内存中创建。我已经在使用映射器的地方给出了代码,这只在整个应用程序中放置。

enter image description here

代码:

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());
    }
java cassandra garbage-collection jvm datastax
1个回答
1
投票

您不正确地使用对象映射器-您仅将其用于将行映射到POJO中。您遇到以下问题-您正在使用QueryBuilder构建单个CQL查询,这导致以下问题-Cassandra需要分别接收和解析每个CQL语句-这严重损害了性能。您可以build the query with placeholders, prepare itthen bind parameters-这应该快得多。

但是实际上,您只需要正确使用对象映射器-如果您已经具有Mapper实例,则可以选择以下选项:

  1. 如果有完整的主键,请使用mapper.get, and other CRUD operations
  2. 如果查询可能返回多个结果,或者您需要自定义查询,请使用mapper.get。>
  3. 这将使您的生活更加轻松,因为您无需构建查询-对象映射器将基于POJO注释在后台进行所有操作,然后通过准备它来优化查询执行,等等。


0
投票

如果JVM中有可用内存,则Java垃圾收集器不能保证立即运行或删除所有无效对象。进行不必要的收集通常会降低应用程序的吞吐量或增加暂停时间。

© www.soinside.com 2019 - 2024. All rights reserved.