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

Dky*_*kyc 6 orm caching hibernate jpa hibernate-mapping

我们正在开发一个项目中使用Hibernate和JPA.目前在Wildfly上运行,未来可能性是根据需要的商业版本.

这里的Hibernate 文档中列出了二级缓存的一些替代方案.还有其他解决方案,如Hazelcast.在替代方案中,似乎JBoss正式支持Infinispan解决方案.

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

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

Vla*_*cea 5

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

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

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

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

  3. 如果您的应用程序实际上不使用实体而是使用各种数据连接投影,那么您应该添加数据库索引并确保有足够的 RAM 供数据库服务器从内存中提供数据,而不会影响磁盘。

解决方案:

我建议您使用HazelCast,它是一种高性能的内存数据网格。HazelCast 允许您将其集成为二级缓存,或者您可以根据需要保存整个对象图。只需按照他们关于如何将其集成到当前应用程序的文档进行操作即可。