我想知道为什么每当我更改数据库中的某些内容时 Ehcache 都会获取最新数据。根据 Ehcache 的文档,它应该仅在一定的时间间隔后获取。我对么?
这是我的 ehcache.xml
<?xml version="1.0"?>
<ehcache>
<defaultCache
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="200" />
<cache name="com.sch.Employee"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="200" />
</ehcache>
我的实体类
package com.sch;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Entity
public class Employee {
@Id
private int id;
private String name;
public Employee() {
}
public Employee(String name, float salary) {
super();
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我的理解正确吗?如果没有,EHcache 的幕后到底运行着什么?
最佳答案
TTI
和 TTL
决定驱逐过程。
timeToIdleSeconds – 元素可以在缓存中存在而不被访问的最大秒数。该元素在此限制后过期,并且将不再从缓存中返回。默认值为 0,这意味着不会发生 TTI 驱逐(无限生命周期)。
timeToLiveSeconds – 元素可以在缓存中存在的最大秒数(无论是否使用)。该元素在此限制后过期,并且将不再从缓存中返回。默认值为 0,这意味着不会发生 TTL 驱逐(无限生命周期)。
根据定义,您为 Employee 拥有的秒数
<cache name="com.sch.Employee"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="200" />
如果您在部署后 5 秒内没有访问员工记录,它将从数据库中获取。
无论如何,即使TTL是200秒,这与使用无关。
因此,设置 TTL - 0、TTI - 3600 并重新测试应用程序。
这样,TTL 驱逐就不会发生,TTI 为一小时,因此您有时间测试您的应用程序
关于java - 使用 Java 在 Hibernate 中使用 Ehcache 获取最新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35643335/