gpt4 book ai didi

java - 为什么 Hibernate query.list() 很慢?

转载 作者:太空狗 更新时间:2023-10-29 22:56:40 25 4
gpt4 key购买 nike

我使用的是 Hibernate 4.1.6,但构建列表的速度存在问题。我正在运行以下查询。

public void doQuery(final Baz baz){
final Query query = getSessionFactory().getCurrentSession().createQuery(
"select c.id, foo.someValue from Foo as foo "+
"join foo.a as a"+
"join foo.b as b "+
"join b.c as c "+
"where baz=:baz"
);
query.setParameter("baz", baz);
Long start=System.currentTimeMillis();
final List<Object[]> list = query.list();
Long end=System.currentTimeMillis();
System.out.println((end-start));
}

我将 hibernate 调试设置为打开以获取发送到数据库的实际查询。我直接在数据库中运行该查询,它在 0.015 毫秒内返回了 23,000 行。所以,我猜查询不是问题。上面的示例显示创建该列表大约需要 32 秒。有什么办法可以加快速度吗?

更新:我尝试使用 hibernate 调试查询来使用 createSQLQuery() 方法,它的运行速度与 createQuery() 方法一样慢。

更新:我尝试使用无状态 session ,但它运行起来同样缓慢。

更新:我输出了一些统计数据(将 hibernate.generate_statistics 标志设置为 true),但对我来说没有什么值得警惕的:

Hibernate SessionFactory Statistics [
Number of connection requests[4]
Number of flushes done on the session (either by client code or by hibernate[3]
The number of completed transactions (failed and successful).[3]
The number of transactions completed without failure[3]
The number of sessions your code has opened.[4]
The number of sessions your code has closed.[3]
Total number of queries executed.[4]
Time of the slowest query executed.[28258]
the number of collections fetched from the DB.[6]
The number of collections loaded from the DB.[6]
The number of collections that were rebuilt[0]
The number of collections that were 'deleted' batch.[0]
The number of collections that were updated batch.[0]
The number of your objects deleted.[0]
The number of your objects fetched.[1]
The number of your objects actually loaded (fully populated).[204]
The number of your objects inserted.[1]
The number of your object updated.[0]
]

Hibernate SessionFactory Query Statistics [
total hits on cache by this query[0]
total misses on cache by this query[0]
total number of objects put into cache by this query execution[0]
Number of times this query has been invoked[1]
average time for invoking this query.[28258]
maximum time incurred by query execution[28258]
minimum time incurred by query execution[28258]
Number of rows returned over all invocations of this query[23303]
]

更新:当从 native 查询的 ScrollableResults 执行 next() 时,我看到同样的缓慢。请注意,我在循环中什么也没做。

    ScrollableResults results = query.scroll();
Long start=System.currentTimeMillis();
while (results.next()) {
//do nothing
}
Long end=System.currentTimeMillis();
System.out.println((end-start));

最佳答案

我不是 100% 确定这个答案,因为调整/优化问题总是很难查明。

但是,基于您打开 show_sql、提取查询并直接针对数据库运行并通过 Hibernate Query 看到亚秒级结果与执行时间的事实,我关注的是Hibernate 构造和混合由 query.list() 调用产生的对象的方式。

另一个用户在 Hibernate 中提到了类似的查询性能问题,并且通过在 POJO 中添加完整的便利构造函数(接受每个字段值的构造函数)看到了显着的性能提升:Simple hibernate query returning very slowly

听起来好像是他们偶然发现了这个修复程序,并且没有清楚地理解为什么它会起作用。有人猜测 Hibernate 必须使用反射来检测属性。我自己很好奇,并计划在有机会时深入研究 Hibernate 的源代码以更好地理解这一点。不过与此同时,您可能希望为您的所有 POJO 类属性添加这些带有参数的完整构造函数,看看这是否会产生影响。

请务必让我知道您发现了什么,因为我对 Hibernate 性能优化非常感兴趣。谢谢!

关于java - 为什么 Hibernate query.list() 很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12163268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com