重用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.put
和cache.get
等
这会进行一些未经检查的转换,我会说当您将来升级 Hibernate 或 Ininispan 时,它很可能会发生变化。
另一种方法可能是使用您自己的版本扩展 InfinispanRegionFactory
并覆盖方法,这样您就可以在那时创建自己的缓存。在这种情况下,您需要更改配置 hibernate.cache.region.factory_class
以指向您的 class。
我们将 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.put
和cache.get
等
这会进行一些未经检查的转换,我会说当您将来升级 Hibernate 或 Ininispan 时,它很可能会发生变化。
另一种方法可能是使用您自己的版本扩展 InfinispanRegionFactory
并覆盖方法,这样您就可以在那时创建自己的缓存。在这种情况下,您需要更改配置 hibernate.cache.region.factory_class
以指向您的 class。