【问题标题】:Reuse Hibernate Second Level Cache to Cache Instances in the Code?重用Hibernate二级缓存来缓存代码中的实例?
【发布时间】:2020-11-20 18:30:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: hibernate infinispan second-level-cache


    【解决方案1】:

    可以像这样深入 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 以指向您的班级。

    【讨论】:

    • 虽然可能,但我不会在 Hibernate 中将 Infinispan 缓存重用于其他用途,因为缓存是专门为该用例配置的。缓存管理器可以在 Spring Boot 中相对安全地重用。在 WildFly 中,可以在单个 JGroups 集群之上构建多个缓存管理器。
    • 我同意搞乱休眠缓存是个坏主意。使用相同的缓存管理器似乎没问题,但使用其他应用程序功能的缓存。
    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 2014-11-28
    • 2011-12-18
    • 2012-12-12
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多