【问题标题】:When/How do I set Ehcache used by Hibernate size programmatically何时/如何以编程方式设置 Hibernate 使用的 Ehcache 大小
【发布时间】:2019-03-20 06:57:39
【问题描述】:

我通过添加以下内容在 Hibernate 4.3.11 中启用了二级缓存:

 config.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory");
 config.setProperty("hibernate.cache.use_second_level_cache", "true");

到我的休眠配置。

这是我的 pom.xml (不确定是否有必要让 pom 定义如此尴尬)

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-ehcache</artifactId>
      <version>4.3.11.Final</version>
      <exclusions>
          <exclusion>
              <groupId>net.sf.ehcache</groupId>
              <artifactId>ehcache-core</artifactId>
          </exclusion>
      </exclusions>
      </dependency>
      <dependency>
          <groupId>net.sf.ehcache</groupId>
          <artifactId>ehcache</artifactId>
          <version>2.7.0</version>
      </dependency>

这是我要缓存的类

@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

但是如何在创建数据库时在代码中配置缓存大小,对我来说使用 Xml 文件是不切实际的,它只会增加构建过程的复杂性,我更喜欢在代码中执行。

更新,从 Hibernate 创建数据库后,我发现缓存已经创建

CacheManager.create();
String[] cacheNames = CacheManager.getInstance().getCacheNames();
for(String cacheName:cacheNames)
{
    MainWindow.logger.severe("CacheName:"+cacheName);
    Cache cache = CacheManager.getInstance().getCache(cacheName);
    cache.getCacheConfiguration().setMaxEntriesInCache(1000);
    cache.getCacheConfiguration().setLogging(true);
}

但是我如何影响它们的创建方式或像我所做的那样修改值足以更新。当我运行时,我没有看到任何调试输出或任何表明正在使用缓存的信息。

【问题讨论】:

  • 首先不要使用EhCache 2,而是使用EhCache 3。可以预期EhCache 2的使用和支持会慢慢消失。
  • 对于 EhCache,我无法立即回答实际问题。我是cache2k的作者。如果你愿意,我可以整理一份关于如何将 cache2k 与 hibernate 一起使用的指南。
  • 为什么 XML 文件对您来说很麻烦会很有趣。也许您希望它从您的应用程序配置中的其他值派生?在 cache2k 中,我至少有一些机制可以通过系统属性使用/设置值。
  • 好吧,我假设它可以是工作目录中的独立文件,也可以位于主类路径上的 jar 中。但在任何一种情况下,我都必须修改我的构建脚本,如果只有 allowedmstandalone 文件必须检查每个启动文件是否存在,否则缓存将是无限的并使用所有内存!
  • 我使用 Hibernate Class 构建的配置类,我可以看到您可以使用 CacheManager.getInstance() 但这是在 hibernate 已经创建缓存之后。我并不特别依赖 Ehcache 这只是默认设置,似乎我可以使用 JCache(不知道这一点),但我使用的关键是有一种方法可以影响 Hibernate 如何创建它的缓存

标签: hibernate ehcache hibernate-4.x


【解决方案1】:

您可以继承 org.hibernate.cache.ehcache.EhCacheRegionFactory 并手动执行任何缓存配置,然后告诉 Hibernate 使用您的自定义缓存工厂:

Configuration.setProperty("hibernate.cache.region.factory_class", "my.cache.FactoryClass");

见:http://www.ehcache.org/documentation/2.7/integrations/hibernate.html#set-the-hibernate-cache-provider-programmatically-

【讨论】:

  • 好吧,我看了这个,似乎并没有直接提供一个替代类来做到这一点。所以最后我不情愿地决定使用 ehcache.xml 代替它在 dev 中工作,但在构建生产版本时给了我更多的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 2012-09-08
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多