我从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的成本 - 我的应用程序是软实时)
感谢。
答案 0 :(得分:0)
首先,为什么不直接检索完整对象而不是id。一个用于检索多个对象的select语句比单独检索每个项目快几倍。
其次,你可能需要为hibernate提供二级缓存。第一级缓存主要适用于每个会话。
答案 1 :(得分:0)
Hibernate中的第一级缓存对应于会话。因此,如果会话尚未加载给定对象,那将是一个未命中。 您需要启用二级缓存才能跨会话按ID缓存对象。
查看参考文档以获取更多信息http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#performance-cache