重用Hibernate二级缓存在代码中缓存实例?

Reuse Hibernate Second Level Cache to Cache Instances in the Code?

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

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

指向 Hibernate 使用的完全相同的配置文件并没有阻止应用程序创建第二个 cacheManager。如何复用已有的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。