QueryDsl 可以处理更大量的数据吗?

Can QueryDsl handle bigger amounts of data?

所以我在 Java 中使用 QueryDsl 构建了一个查询,如下所示(生产名称换成了虚拟名称,但查询 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 查询有错误?

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

240K的结果是很多记录到return。在这里投影了四个字段,我们至少在谈论一百万个对象。如果这些字符串很大,那么这就是一个问题。虽然与 QueryDSL 并不真正相关。如果您在循环中创建相同数量和大小的字符串,您将得到相同的异常。

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