1

我正在尝试将我的项目代码从 OSCache 迁移到 EhCache。

我们不仅将 OSCache 用作二级 Hibernate 缓存提供程序,而且还用于存储其他不同性质的对象。由于缓存键不重叠,它们都愉快地共享同一个缓存实例,而不会发生任何冲突。

向 EhCache 迁移时的一大区别是每个区域都有不同的缓存实例。这可能很好,因为它可以提高查找速度,因为不同性质的数据是分开存在的。不幸的是,这有配置地狱的代价。让我解释。

在 OSCache 世界中,我会将我的缓存容量配置为 10000。现在,如果特定安装需要/可以提供更多 RAM,我可以轻松地将其增加到 50000,这样就可以了。现在在 EhCache 中,我必须按此增量的一部分为每个区域更改设置!

此外,一个安装可能对 X 类型的对象有更高的使用率,而另一种安装可能更喜欢 Y 类型的对象的更高流失率。我们有几十个安装,每个安装会有数百个不同的缓存。为此,我们将不得不雇佣一群人,除了监控缓存模式和调整设置之外什么都不做!

我期待CacheManager有某种全局缓存容量设置,每个内部缓存都会争取更多容量,具体取决于条目使用情况。但是,我发现设置缓存容量的唯一方法是通过CacheConfiguration多对一对抗CacheManager.

到目前为止,我能看到的唯一选择是尝试强制 Hibernate 为所有实体使用一个全局缓存。有人知道该怎么做吗?对于我的场景,还有其他更好的解决方案吗?

4

1 回答 1

2

您可以尝试拥有一个缓存并在其周围添加装饰器。装饰器的名称可以与您的区域名称匹配,以便休眠可以使用这些缓存,但这些装饰器将在下面使用相同的缓存。所以只有一个缓存配置需要管理。您可以通过实现自定义缓存装饰器并设置装饰缓存的名称来实现此目的。

你可以有这样的 ehcache.xml :

<defaultCache maxElementsInMemory="10000" eternal="false"
    overflowToDisk="false"/>

<cache name="singleSharedCache" maxElementsInMemory="2000"
    eternal="false" overflowToDisk="false">
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory"
        properties="name=org.hibernate.tutorial.domain.Person" />
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory"
        properties="name=org.hibernate.tutorial.domain.Event" />
</cache>

“com.xyz.util.CustomEhcacheDecoratorFactory”是一个自定义的 ehcache 装饰器工厂类,用于创建装饰的 ehcache。您可以使用“properties”属性以任何您想要的方式设置修饰的 ehcache,这里您只使用 name 属性来配置新修饰的 ehcache 的名称。所有其他操作都可以委托给底层缓存。

在这里提供一个适用于此用例的自定义缓存装饰器,它重用 ehcache jar 中的 EhcacheDecoratorAdapter 并仅覆盖 getName()。EhcacheDecoratorAdapter 将所有操作委托给您在构造函数中传递的底层 ehcache:

包 com.xyz.util;

导入 java.util.Properties;

导入 net.sf.ehcache.Ehcache;
导入 net.sf.ehcache.constructs.CacheDecoratorFactory;
导入 net.sf.ehcache.constructs.EhcacheDecoratorAdapter;

公共类 CustomEhcacheDecoratorFactory 扩展 CacheDecoratorFactory {

    public Ehcache createDecoratedEhcache(最终的Ehcache缓存,
            最终属性属性){
        返回新的 EhcacheDecoratorAdapter(缓存) {
            私有最终字符串名称 = properties.getProperty("name");

            公共字符串 getName() {
                返回名称;
            }
        };
    }

    public Ehcache createDefaultDecoratedEhcache(最终的Ehcache缓存,
            最终属性属性){
        返回新的 EhcacheDecoratorAdapter(缓存) {
            私有最终字符串名称 = properties.getProperty("name");

            公共字符串 getName() {
                返回名称;
            }
        };
    }
}

于 2010-12-22T11:40:58.573 回答