java – Hibernate的本机查询和缓存机制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Hibernate的本机查询和缓存机制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2369字,纯文字阅读大概需要4分钟。
内容图文
我有一个关于Hibernate缓存机制的问题.我在文章中读到了hibernate中本机SQLquery的执行,使缓存的所有区域无效,因为hibernate对它将影响哪个特定实体一无所知.这里缓存的所有区域意味着我们在讨论二级缓存的各个区域或两个级别的缓存(第一级缓存,第二级缓存)或仅第二级缓存还是仅第一级缓存?
解决方法:
此article解释了Hibernate查询缓存的工作原理以及本机查询对现有缓存条目的影响.
使用SQLQuery,Hibernate无法知道您可能会影响哪些缓存区域,但幸运的是,您可以明确地指示它:
SQLQuery sqlQuery = session.createSQLQuery(
"UPDATE CUSTOMER SET ... WHERE ...");
sqlQuery.addSynchronizedEntityClass(Person.class); int
int updateCount = sqlQuery.executeUpdate();
这样它就知道哪些查询缓存无效,否则它可能会丢弃所有内容:
private static class EntityCleanup {
private final EntityRegionAccessStrategy cacheAccess;
private final SoftLock cacheLock;
private EntityCleanup(EntityRegionAccessStrategy cacheAccess) {
this.cacheAccess = cacheAccess;
this.cacheLock = cacheAccess.lockRegion();
cacheAccess.removeAll();
}
private void release() {
cacheAccess.unlockRegion( cacheLock );
}
}
private static class CollectionCleanup {
private final CollectionRegionAccessStrategy cacheAccess;
private final SoftLock cacheLock;
private CollectionCleanup(CollectionRegionAccessStrategy cacheAccess) {
this.cacheAccess = cacheAccess;
this.cacheLock = cacheAccess.lockRegion();
cacheAccess.removeAll();
}
private void release() {
cacheAccess.unlockRegion( cacheLock );
}
}
private class NaturalIdCleanup {
private final NaturalIdRegionAccessStrategy naturalIdCacheAccessStrategy;
private final SoftLock cacheLock;
public NaturalIdCleanup(NaturalIdRegionAccessStrategy naturalIdCacheAccessStrategy) {
this.naturalIdCacheAccessStrategy = naturalIdCacheAccessStrategy;
this.cacheLock = naturalIdCacheAccessStrategy.lockRegion();
naturalIdCacheAccessStrategy.removeAll();
}
private void release() {
naturalIdCacheAccessStrategy.unlockRegion( cacheLock );
}
}
因此,正如您所看到的,该区域的整个数据被逐出.
这仅影响二级缓存.每次运行本机查询时都不会清除第一级缓存(a.k.a.会话),因为这会分离所有当前的“附加实体”,从而在实体状态期望中产生意外后果.但是在每个查询(HQL或本机)之前刷新会话以使db和会话在执行查询之前保持同步,因此在发出新的select之前,第一级缓存是一致的.
整个区域将失效,而不是整个二级缓存.实体定义缓存区域,因此更新特定实体表只会删除属于受本机查询影响的特定表的所有实体.
但是,重写与本机查询关联的查询空间定义是一种自定义Hibernate的方法,不像使用默认实现那样清除缓存区域.
内容总结
以上是互联网集市为您收集整理的java – Hibernate的本机查询和缓存机制全部内容,希望文章能够帮你解决java – Hibernate的本机查询和缓存机制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。