繁体   English   中英

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 查询中有错误?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM