适用于Hibernate二级缓存的解决方案

时间:2014-11-13 13:25:08

标签: hibernate caching jpa orm hibernate-mapping

我们正在开发的项目中使用Hibernate和JPA。目前在Wildfly上运行,未来的可能性是商业版本,取决于需求。

Hibernate documentation here中列出了二级缓存的一些替代方案。还存在其他解决方案,例如Hazelcast。在替代方案中,似乎JBoss正式支持Infinispan solution

正如许多项目中的情况一样,我们有一些表很少会发生变化,例如城市列表,项目可以拥有的状态等等。因此我们决定对这种情况使用二级缓存

  • 您能否在这种情况下分享您的专业知识?这是一个很好的用例吗?有没有更好的方法来保存这些数据?你如何处理很少或从未改变的数据?
  • 您过去使用过哪个提供商和/或目前用作二级缓存?为什么?您选择的解决方案的优缺点是什么?

3 个答案:

答案 0 :(得分:2)

  1. 二级缓存是关系数据缓存,而不是一个完整的对象缓存解决方案。所以它只是基本的实体属性和保存的外键。对于实体关联,* -To-One可能保存在不同的缓存区域,而* -To-Many关系也需要启用查询缓存。

    我认为当您的实体实际上不时更改时,二级缓存会更有用。当实体被确定为脏时,第二级缓存条目无效。

  2. 但是如果您很少更改数据,那么使用实际的对象缓存可能会更好。对象缓存将存储整个对象关系树,如果你主要操作实体,它是一个更好的选择,而不是自由式连接投影。

    因此,如果您的工作流程围绕具有层次结构的实体,那么对象缓存更合适。

  3. 如果您的应用程序实际上没有实体操作但有各种数据加入预测,那么您应该添加数据库索引并确保有足够的RAM供DB服务器从内存中提供数据,没有碰到磁盘。

  4. 解决方案:

    我建议你使用HazelCast,这是一个高性能的内存数据网格。 HazelCast允许您将其集成为二级缓存,或者如果需要,可以保存整个对象图。只需按照他们的文档介绍如何将其集成到当前的应用程序中。

答案 1 :(得分:1)

我使用ehcache存储和缓存地理数据。使用起来非常方便。看看他们的网站http://ehcache.org/

答案 2 :(得分:1)

Hibernate二级缓存最适合很少或从不更改的数据。但是,由于hibernate提供了由多个缓存解决方案实现的通用缓存提供程序,因此限制了缓存解决方案提供的功能的可用性。

作为一种解决方案,我建议您使用TayzGrid作为休眠二级缓存,因为除了基本的缓存功能和过期等,它还提供了数据库依赖性,即缓存中的数据将自动被缓存无效(如果相应的话)数据库更改中的记录。您可以在此处查找更多详细信息:http://www.alachisoft.com/tayzgrid/hibernate-second-level-cache.html