标签: evict

NHibernate Session.Evict有什么作用?

以下代码段的作用是什么?为什么要使用Evict?

private void DoEvict(customer cust)
{
    AddressRepository.Evict(cust.Address);
    cust.Address = AddressRepository.Get(cust.Address.Id);
}
Run Code Online (Sandbox Code Playgroud)

nhibernate evict

20
推荐指数
1
解决办法
1万
查看次数

为什么我的实体不会从我的二级缓存中被逐出?

我正在使用Hibernate 4.3.11.Final和Spring 3.2.11.RELEASE.我很困惑为什么我的缓存驱逐不起作用.我在DAO中设置了这个...

@Override
@Caching(evict = { @CacheEvict("main") })
public Organization save(Organization organization)
{
    return (Organization) super.save(organization);
}

@Override
@Cacheable(value = "main")
public Organization findById(String id)
{
    return super.find(id);
}
Run Code Online (Sandbox Code Playgroud)

这是我的Spring配置......

<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" …
Run Code Online (Sandbox Code Playgroud)

spring hibernate ehcache second-level-cache evict

10
推荐指数
1
解决办法
1583
查看次数

缓存逐出多个键之一

在我的应用程序中,我有多个带有多个键的可缓存方法:

@Cacheable(cacheNames = "valueCodes", key = "{#value, #fieldId, #projectId}")
@Cacheable(cacheNames = "fieldNames", key = "{#field, #value, #projectId}")
@Cacheable(cacheNames = "qi", key = "{#langCode, #question, #projectId}")
@Cacheable(cacheNames = "fieldCodes", key = "{#name, #projectId}")
Run Code Online (Sandbox Code Playgroud)

现在我想要一个 cachevict 方法来清除所有缓存,其中只有#projectId 键(UUID)匹配:

@CacheEvict(value = {"valueCodes", "fieldCodes", "qi"; "fieldCodes"}, key = "#projectId")
Run Code Online (Sandbox Code Playgroud)

我在这篇文章中读到这是不可能的,而且

只有 evict 注释的键正则表达式匹配每个 cacheNames 中的多个元素

我不太确定他们的意思,但我想这与在SpEL 中使用正则表达式有关。

所以我开始考虑将我的密钥合并为一个密钥:

@Cacheable(cacheNames="cahceName", key="concat(#projectId).concat(#otherKey)")
Run Code Online (Sandbox Code Playgroud)

并使用正则表达式将所有键与 projectId 后跟通配符匹配。但我真的找不到办法做到这一点。

我正在努力实现的可能吗?如果是这样,我该怎么做?

java spring caching spring-el evict

6
推荐指数
2
解决办法
1万
查看次数

"记忆"类型的驱逐与"计数"类型不同

我想使用Infinispan作为图像二进制数据(Java类型byte[])的缓存.我假设Infinispan默认策略是LIFO或类似的策略,更喜欢保留最近使用/添加的缓存实体.

在我的loadtest场景中,我在一轮中进行四次调用以检索给定的实体.假设第一个调用永远不会到达缓存(因为每一轮都请求一个唯一的实体),但是后面三个总是命中缓存.所以预期的配置文件如下所示:

#1: MISS-HIT-HIT-HIT
#2: MISS-HIT-HIT-HIT
...
Run Code Online (Sandbox Code Playgroud)

当我使用COUNT具有一定数量实体的驱逐类型配置Infinispan时,它可以正常工作:

<local-cache name="imagesCache" statistics="true">
    <!-- lifespan="30 min" max-idle="30 min" interval="1 min" -->
    <expiration lifespan="1800000" max-idle="1800000" interval="60000" />
    <memory>
        <binary eviction="COUNT" size="500" />
    </memory>
</local-cache>
Run Code Online (Sandbox Code Playgroud)

统计数据显示在运行结束时(以及中间)确切的3/4缓存命中: 在中间缓存COUNT类型的JMX统计信息

基于我在loadtest中捕获的数字的缓存命中率: (2952-738)/2952 = 0.75

当我更改要保留在内存中的实体数量(<binary eviction="COUNT" size="100" />)时,命中率不会改变(如预期的那样).

在运行期间,我测量了负载测试之前和之后的堆大小(在几次GC调用之后进行的测量),结果是500个实体占用大约114.895.000 - 62.445.000 = 52.450.000字节=每个实体大约100KB: 最后缓存COUNT类型的堆统计信息

之后,我重新启动了应用程序,只对缓存配置进行了这么小的改动:

<memory>
    <binary eviction="MEMORY" size="1000000" />
</memory>
Run Code Online (Sandbox Code Playgroud)

我希望Infinispan的性能具有相同的配置文件,但事实证明,一旦给定的内存量完全分配,新添加的实体不会驱逐旧实体但会立即被驱逐.这意味着大约在添加100个实体之后,所有四个缓存结果缓存未命中的请求.可以看出比率现在是0.58而不是0.75: 最后缓存MEMORY类型的堆统计信息

缓存命中率: (2952-738-504)/2952 = 0.579

如果我增加内存,确实命中率接近0.75但是我希望命中率与内存大小无关(假设内存可以适合至少几个实体).

一旦我将钝化配置为文件,基于内存的驱逐策略就会按预期开始工作:

<local-cache name="imagesCache" statistics="true">
    <expiration lifespan="1800000" max-idle="1800000" interval="60000" />
    <persistence passivation="true">
        <file-store …
Run Code Online (Sandbox Code Playgroud)

java caching infinispan evict

5
推荐指数
0
解决办法
278
查看次数

当 RAM 已满时,redis 中是否有基于数据库的密钥驱逐策略

我在我的 redis 服务器中使用了 5 个数据库。我想使用 LRU 机制驱逐属于特定数据库的键。是否可以 ?

我读到:how-to-make-redis-choose-lru-eviction-policy-for-only-some-of-the-keys。

但是我所有的数据库都在使用时间来保存它们的条目。所以不能使用volatile-lru策略。

我尝试了volatile-ttl策略,但其他数据库的密钥的 ttl 较少。所以他们会被驱逐,这是我不想要的。

lru redis evict

5
推荐指数
1
解决办法
1390
查看次数

NHibernate缓存问题 - 何时调用Evict?

我遇到了一个明显的缓存问题,即NHibernate返回的内容与数据库中的内容不匹配.

我相信这是level2缓存数据.看起来我可以使用Evict来执行此操作,但是什么时候应该实际调用Evict方法? 对于我的特定应用程序,数据对用户来说是唯一的,并且提供的数据很可能只使用一次*.

我可以完全禁用这些对象的Level2缓存吗?

更新10/31

我的情况是:我有一个购物车,客户将添加和删除项目.什么我做的是以下几点:处理到购物车更新之前,我驱逐Cart和CartProduct实体.完成后,我CartProducts从提供程序中检索列表并返回视图(这发生在.NET MVC控制器中).

更新11/3

购物车已经完成,我遇到了一个似乎与同一个NHibernate问题有关的问题,但实际上是一个MVC问题.更深入的挖掘揭示了HTML Helper扩展覆盖了我想要的值,并取而代之的是Model状态.所以在这个问题上有一个双重打击.希望这有助于某人.

nhibernate asp.net-mvc caching evict

4
推荐指数
1
解决办法
1万
查看次数