【发布时间】: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