首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用部分键从我的二级ehcache中逐出(通过注释)?

如何使用部分键从我的二级ehcache中逐出(通过注释)?
EN

Stack Overflow用户
提问于 2016-03-08 06:19:28
回答 2查看 835关注 0票数 0

我使用Hibernate 4.3.11.Final与ehcache和Spring3.2.11.RELEASE。我有下面的Spring/ehcache配置…

代码语言:javascript
复制
<cache:annotation-driven key-generator="cacheKeyGenerator" />

<bean id="cacheKeyGenerator" class="org.mainco.subco.myproject.util.CacheKeyGenerator" />

<bean id="cacheManager"
    class="org.springframework.cache.ehcache.EhCacheCacheManager"
    p:cacheManager-ref="ehcache"/>

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
    p:configLocation="classpath:ehcache.xml"
    p:shared="true" />

<util:map id="jpaPropertyMap">
    <entry key="hibernate.show_sql" value="true" />
    <entry key="hibernate.dialect" value="org.mainco.subco.myproject.jpa.subcoMysql5Dialect" />
    <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
    <entry key="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
    <entry key="hibernate.cache.use_second_level_cache" value="true" />
    <entry key="hibernate.cache.use_query_cache" value="false" />
    <entry key="hibernate.generate_statistics" value="true" />
    <entry key="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE" />
</util:map>

<bean id="sharedEntityManager"
    class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

使用下面的自定义密钥生成器…

代码语言:javascript
复制
public class CacheKeyGenerator implements KeyGenerator 
{

    @Override
    public Object generate(final Object target, final Method method, 
      final Object... params) {

        final List<Object> key = new ArrayList<Object>();
        key.add(method.getDeclaringClass().getName());
        key.add(method.getName());

        for (final Object o : params) {
            key.add(o);
        }
        return key;
    } 
}

如您所见,键是基于类名、方法名,然后是任何参数生成的。我的问题是,如果我想从二级缓存中删除缓存键的第一个条目(因为我的键是一个数组)为“org.mainco.subco.standards.repo.StandardsDao”,的所有条目,我该如何编写这样的@CacheEvict规则呢?以下代码在…中不起作用

代码语言:javascript
复制
@Caching(evict = { @CacheEvict(value="main", key="{'org.mainco.subco.standards.repo.StandardsDao'}")})
public int deleteCorrelationTypeContexts(String categoryId)

任何指导都是值得感谢的。有一个限制,它不是一个使用多个二级缓存的选项-我只能对这个应用程序使用一个(名为“main”的缓存)。

EN

回答 2

Stack Overflow用户

发布于 2016-03-09 01:42:46

简而言之,这是行不通的。这不是@CacheEvict annotation works的方式。

而且,大多数缓存实现本身都没有这样的API。

票数 0
EN

Stack Overflow用户

发布于 2017-04-18 06:09:19

我也遇到了同样的问题,并发现“这不是常见的缓存实现的工作方式”。

因此,您需要实现自己的缓存提供程序,并覆盖在您选择的实现中存在的任何"key's matcher“。

可以在here中找到GuavaCache示例的一个很好的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35855249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档