从OpenJPA 1.2迁移到Hibernate 4.0后,find()方法中的性能问题

时间:2012-10-31 07:01:39

标签: performance hibernate jpa openjpa timesten

我从OpenJPA 1.2迁移到Hiberante 4.0
我正在使用TimesTen DB

我正在进行本机查询以获取我需要的对象的id,然后对它们执行查找。 在OpenJPA而不是找到我使用findCache()方法,如果它返回null我使用find()方法,在休眠中我只使用find()方法。

我在同一个数据库上执行了此操作。

经过几次测试后,我发现OpenJPA的性能要好得多。

我打印了hibernate会话的统计信息(在查询和查找相同的对象之后),并看到第一级缓存的hit\miss计数始终为0。 而OpenJPA通过使用findCache方法获取对象显然达到了它的缓存。

如何在Hibernate中提高find的性能? 我怀疑它提到了这个工具的第一级缓存实现的差异。

另一个事实:我在应用程序运行时使用相同的EntityManager(我需要最小化创建EntityManager的成本 - 我的应用程序是软实时)

感谢。

2 个答案:

答案 0 :(得分:0)

首先,为什么不直接检索完整对象而不是id。一个用于检索多个对象的select语句比单独检索每个项目快几倍。

其次,你可能需要为hibernate提供二级缓存。第一级缓存主要适用于每个会话。

答案 1 :(得分:0)

Hibernate中的第一级缓存对应于会话。因此,如果会话尚未加载给定对象,那将是一个未命中。 您需要启用二级缓存才能跨会话按ID缓存对象。

查看参考文档以获取更多信息http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#performance-cache