我正在尝试使用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 value: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 回答
嗯..问题在于使用org.hibernate.cache.UpdateTimestampsCache的查询缓存 . Hibernate代码库需要花一些时间来解决它 .
使用StandardQueryCache时; Hibernate为UpdateTimestampsCache中的每个表保留最新更新的时间戳,以便它知道表的最后更新时间 . 这有助于我们跟踪查询缓存中的任何实体是否在跟踪查询结果后更新 .
由于Hibernate无法跟踪确切的实体,因此它将所有实体添加到已保存/更新的UpdateTimestampsCache中 . 所以基本上我看到的put()实际上是将实体类型(特别是表)放在UpdateTimestampsCache中并使它们无效,并且每当通过Hibernate插入/更新相同类型的实体时替换为新值 .