【发布时间】:2010-12-19 22:46:03
【问题描述】:
我正在使用 Hibernate EntityManager,并且在我的 Hibernate 查询中遇到了奇怪的减速。看看这段代码:
public void testQuerySpeed() {
for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getResultList();
}
}
这在我的机器上运行大约 750 毫秒。考虑到它只是选择一个常数整数,速度并不快,但可以接受。我的问题出现在我启动查询之前在我的 EntityManager 会话中加载任何实体的那一刻:
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.find() 后面加上em.clear(),问题就会再次消失,运行时间会回到 750 毫秒。
我在这里使用了本机查询,但是 HQL 查询也存在问题。每当实体处于 EntityManager 会话中时,似乎所有查询至少需要 70 毫秒。
在生成需要 n+1 个查询的列表时,这种性能下降确实对我们造成了伤害。
我已经测试了最新的 Hibernate 3.5 beta,并且遇到了完全相同的问题。有没有人看到这个问题,或者有任何解决方法的想法?
我正在使用 PostgreSQL 8.3,使用资源本地事务(在 Tomcat 中运行)。使用内置连接池,但使用 C3P0 没有区别。
【问题讨论】:
-
你分析了吗?大部分时间都花在了哪里?您是否定义了任何侦听器/拦截器/回调方法?