JPA 查询调用 getter 数百万次

Posted

技术标签:

【中文标题】JPA 查询调用 getter 数百万次【英文标题】:JPA query calling getters millions of times 【发布时间】:2013-11-19 01:16:02 【问题描述】:

我一直在分析我的代码以试图了解瓶颈是什么,并且在运行数据库查询时遇到了一些相当奇怪的行为,我无法解释:

设置场景:

class Edge 
    int from;
    int to;


class Foo 
    ... //50 attributes


class Bar 
    ... //50 attributes


class EdgeDAO extends JpaDaoSupport 
    List<Edge> getEdgesFrom(int from) 
        Map<String, Integer> params = new HashMap<>();
        params.add("from", from);
        return getJpaTemplate().findByNamedParams("from Edge where from=:from, params);
    

分析时,我调用 DAO 方法 getEdgesFrom(int) 246 次。

我无法解释的一点是,JProfiler 报告了 getEdgesFrom(int) 的 246 次调用中,FooBar 上的 50 个 getter 中的每一个都被调用了 4,820,124 次。 FooBar 甚至不在 Edge 对象中。

谁能帮我理解为什么会这样?

【问题讨论】:

尝试调试并查看所做的查询(通过逐步调试最终检测到触发该查询的位置)。没有人告诉过这个方法调用了 Foo 和 Bar 实例的 getter。 【参考方案1】:

问题是FlushMode 设置为AUTO。将此值更改为 COMMIT 解决了问题

【讨论】:

以上是关于JPA 查询调用 getter 数百万次的主要内容,如果未能解决你的问题,请参考以下文章

JPA:迭代大型结果集的正确模式是啥?

是否可以使用 ClickHouse 查询数百万行

查询表包含来自 Oracle 数据库的数百万行

Spring Data JPA:查询如何返回非实体对象或对象列表?

优化查询以更新 Oracle 中的数百万数据?

Java JDBC Oracle SQL 查询每隔几个月就会挂起一次