【问题标题】:Can QueryDsl handle bigger amounts of data?QueryDsl 可以处理更大量的数据吗?
【发布时间】:2020-06-08 11:50:20
【问题描述】:

所以我使用 QueryDsl 在 Java 中构建了一个查询,如下所示(生产名称交换为虚拟名称,但查询是 1:1 相同的)。

QTestA qTestA = QTestA.testA;
QTestB qTestB = QTestB.testB;
QTestC qTestC = QTestC.testC;

JPAQuery<OutputFormat> base = queryFactory
                .select(Projections.constructor(OutputFormat.class, qTestB.somefield, qTestB.somefield2, qTestB.somefield3, qTestC.someBfield))
                .from(qTestA, qTestB, qTestC)
                .where(qTestA.someparam.eq("1234"))
                .where(qTestA.bid.eq(qTestB.id))
                .where(qTestA.cid.eq(qTestC.id));

当我运行它时,我收到以下错误:

java.lang.OutOfMemoryError: Java heap space
    at oracle.jdbc.driver.DynamicByteArray.getStringFromUTF8(DynamicByteArray.java:1067)
    at oracle.jdbc.driver.DynamicByteArray.getString(DynamicByteArray.java:634)

    // ...

    at com.querydsl.jpa.impl.AbstractJPAQuery.getResultList(AbstractJPAQuery.java:160)
    at com.querydsl.jpa.impl.AbstractJPAQuery.fetch(AbstractJPAQuery.java:202)

当我在普通 SQL 中构建与 QueryDsl 相同的语句时,我得到了 240k 个结果。这太多了吗?还是我的 QueryDsl 查询中有错误?

【问题讨论】:

    标签: java memory-leaks querydsl


    【解决方案1】:

    如果这实际上是内存泄漏,那么我首先会怀疑 Oracle JDBC 驱动程序,因为它是堆栈跟踪中字符串分配的来源。

    240K 结果是很多要返回的记录。在这里投影四个场,我们谈论的是最少一百万个对象。如果这些字符串很大,那么这是一个问题。虽然与 QueryDSL 并没有真正的关系。如果你在一个循环中创建相同数量和大小的字符串,你会得到相同的异常。

    对于有这么多结果的查询,您想使用 QueryDSL 的 iterate() 方法。此结果集迭代器由可滚动结果支持,并防止所有记录同时在内存中,因为它允许在迭代期间对以前的记录进行垃圾收集。

    【讨论】:

      猜你喜欢
      • 2011-03-08
      • 2023-03-20
      • 2022-01-04
      • 2014-05-09
      • 1970-01-01
      • 2013-08-28
      • 2011-02-16
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多