hibernate - 重用Hibernate二级缓存来缓存代码中的实例?

标签 hibernate infinispan second-level-cache

我们已将 Infinispan 10.8.1 配置为在我的 Spring Boot 应用程序中用作 Hibernate 二级缓存 (2LC),并且它按预期工作。配置在 infinispan.xml 中完成,传输配置指向 cluster.xml 文件,该文件将 JGroups 配置为使用 TCP 设置 4 台计算机的集群。

我们也想在代码中使用 Infinispan,来缓存不需要持久化的随机实例。但是,我们没有找到重用 Hibernate 使用的相同缓存和集群的方法,因此应用程序最终不会创建第二个集群。

指向 Hibernate 使用的完全相同的配置文件并不会阻止应用程序创建第二个缓存管理器。如何重用现有的cacheManager?

最佳答案

可以深入了解 Hibernate(以 org.hibernate.SessionFactory 开头)并提取底层缓存管理器,如下所示:

    final SessionFactoryImpl factory = (SessionFactoryImpl)sessionFactory;
    final CacheImplementor cache = factory.getCache();
    final InfinispanRegionFactory regionFactory = (InfinispanRegionFactory)cache.getRegionFactory();
    final EmbeddedCacheManager cacheManager = regionFactory.getCacheManager();

现在你有一个cacheManager您可以调用cacheManager.createCache创建自己的缓存,然后调用 cache.putcache.get

这会进行一些未经检查的转换,我想说,当您将来升级 Hibernate 或 Ininispan 时,它很可能会发生变化。

另一种方法可能是扩展 InfinispanRegionFactory使用您自己的版本和覆盖方法,以便您可以在此时创建自己的缓存。您将需要更改配置hibernate.cache.region.factory_class在本例中指向您的类(class)。

关于hibernate - 重用Hibernate二级缓存来缓存代码中的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63182871/

相关文章:

java - 想要使用@query传递字符串来查询Spring数据

java - 执行错误 : org. infinispan.util.concurrent.TimeoutException:ISPN000299:10 秒后无法获取 key 的锁

nhibernate - 如何清除NHibernate中的整个二级缓存

java - hibernate 在二级缓存和各种缓存模式的数据库之间执行同步时?

java - 由于重复的 GUID,无法将数据库状态与 session org.hibernate.exception.ConstraintViolationException 同步

java - JPA系统异常访问字段错误

java - NullPointerException 由 : org. hibernate.MappingException : Could not instantiate Type: com. vladmihalcea.hibernate.type.array.StringArrayType 引起

jboss - Keycloak - Infinispan Redis 缓存存储

caching - Infinispan 可以作为 Apache Shiro 的缓存管理器实现吗?

java - Hibernate引入二级缓存如何解决N+1问题?