gpt4 book ai didi

在 session 中加载实体后,Hibernate 查询会显着减慢

转载 作者:行者123 更新时间:2023-12-04 01:50:18 25 4
gpt4 key购买 nike

我正在使用 Hibernate EntityManager,并且在我的 Hibernate 查询中遇到了奇怪的减速。看看这段代码:

public void testQuerySpeed() {
for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getResultList();
}
}

这在我的机器上运行大约 750 毫秒。考虑到它只是选择一个常量整数,速度并不快,但可以接受。我的问题出现在我启动查询之前在我的 EntityManager session 中加载任何实体的那一刻:
public void testQuerySpeed() {
CommercialContact contact = em.find(CommercialContact.class, 1890871l);

for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getSingleResult();
}
}

em.find() 速度很快,但运行时 1000 次查询增加了十倍多,达到约 10 秒。如果我输入 em.clear()em.find() ,问题又消失了,运行时间又回到了 750 毫秒。

我在这里使用了 native 查询,但 HQL 查询也存在问题。只要实体在 EntityManager session 中,似乎所有查询至少需要 70 毫秒。

在生成需要 n+1 个查询的列表时,这种性能下降确实伤害了我们。

我已经测试了最新的 Hibernate 3.5 beta,并且遇到了完全相同的问题。有没有人看到过这个问题,或者任何关于如何解决它的想法?

我正在使用 PostgreSQL 8.3,使用资源本地事务(在 Tomcat 中运行)。使用内置连接池,但使用 C3P0 没有区别。

最佳答案

我还必须推荐使用 JVM 分析器来查看时间的去向。为 Hibernate session 打开 SQL 语句日志记录也可能没有坏处,只是为了确保您运行的 SQL 没有超出您的想象。

这里首先想到的是 Hibernate Session 的“刷新”行为。您是否在 Session 上明确设置了特定的刷新模式?如果没有,那么你会得到“自动”刷新,它会检查你在 session 中拥有的对象,以确定内存中是否有需要“刷新”回数据库的更改(在事务内部) , 当然)。

我想首先尝试查看它是否有任何效果的最简单的方法是修改上面显示的测试代码,以指定您希望在提交数据库事务时手动进行刷新:

public void testQuerySpeed() {
em.setFlushMode(FlushModeType.COMMIT); // assuming you're using JPA annotations
CommercialContact contact = em.find(CommercialContact.class, 1890871l);

for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getSingleResult();
}
}

我想的另一个想法是询问您是否可以在单独的 EntityManager 中执行批量任务,如果您只是在执行 UPDATE 或 INSERT,这可以工作。

关于在 session 中加载实体后,Hibernate 查询会显着减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1791050/

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