使用EHCache进行Hibernate - 将任何非缓存实体保存在Cache中

时间:2011-07-15 16:55:37

标签: hibernate ehcache

我正在尝试使用EHCache对Hibernate进行二级缓存。我在应用程序中配置了一些已用@Cache标记的实体,我发现它们已被EHCache正确使用。

然而,我观察到的是,当我保存/更新任何其他不应该被缓存的实体时;我看到它被put()方法添加到缓存中。检索数据不会将非缓存对象放入缓存中。

这种行为对我来说似乎不对,因为我们应该只将缓存的对象添加到缓存中,而不是保存/更新操作中的任何对象。

我在这里错过了什么吗?

当我执行任何保存/更新操作时,我会看到正在添加到日志中的实体。

2011-07-15 22:02:28 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put(83)| key:mmd_addresses值:5368822204260352 2011-07-15 22:02:28 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put(83)| key:fqng_users值:5368822205923328 2011-07-15 22:02:29 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put(83)| key:fqng_link_user_applications值:5368822209306624 2011-07-15 22:02:30 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put(83)| key:mmd_addresses值:5368821964824576 2011-07-15 22:02:30 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put(83)| key:fqng_users值:5368821964824576 2011-07-15 22:02:30 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put(83)| key:fqng_link_user_applications值:5368821964824576 2011-07-15 22:05:55 DEBUG [http-0.0.0.0-8080-6] EhcacheGeneralDataRegion.put(83)| key:fqng_users值:5368823053987840

这些对象都没有@Cache注释。

@Entity 
@Table(name = "fqng_users", uniqueConstraints = @UniqueConstraint(columnNames = "NAME")) 
// @Audited 
public class Users implements java.io.Serializable { 

@Entity 
@org.hibernate.annotations.Entity(dynamicUpdate = true) 
@Table(name = "mmd_addresses") 
// @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
public class Addresses implements java.io.Serializable { 

1 个答案:

答案 0 :(得分:1)

嗯......问题在于使用 org.hibernate.cache.UpdateTimestampsCache 的查询缓存。 Hibernate代码库需要花一些时间来解决它。

使用 StandardQueryCache 时; Hibernate为 UpdateTimestampsCache 中的每个表保留最新更新的时间戳,以便它知道表的最后更新时间。这有助于我们跟踪查询缓存中的任何实体是否在跟踪查询结果后更新。

由于Hibernate无法跟踪确切的实体,因此它将所有实体添加到已保存/更新的 UpdateTimestampsCache 中。所以基本上我看到的put()实际上是将实体类型(特别是表格)放在 UpdateTimestampsCache 中并使它们无效并在插入/更新相同类型的实体时替换为新值通过Hibernate。