栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Hibernate的本机查询和缓存机制

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate的本机查询和缓存机制

该文章介绍了Hibernate的查询缓存是如何工作的,并原生查询的在现有的高速缓存条目的影响。

使用SQLQuery,Hibernate无法知道您可能会影响哪些缓存区域,但是幸运的是,您可以明确地指示它:

SQLQuery sqlQuery = session.createSQLQuery(    "UPDATE CUSTOMER SET ... WHERe ..."); sqlQuery.addSynchronizedEntityClass(Person.class); intint 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 );    }}

因此,如您所见,该区域的所有数据都被驱逐了。

这仅影响二级缓存。每次运行本机查询时,都不会清除第一级缓存(也称为会话),因为这会分离当前的所有“附加实体”,从而给实体状态期望带来意外的后果。但是在每个查询(HQL或本机查询)之前,都会刷新会话,以便在执行查询之前数据库和会话处于同步状态,因此在发出新选择之前,一级缓存是一致的。

整个区域将失效,而不是整个二级缓存失效。实体定义了一个缓存区域,因此更新特定实体表只会删除属于该特定表的所有实体,这些实体受本机查询的影响。

但是,覆盖与本机查询关联的查询空间定义是一种自定义Hibernate的方式,该方式不像使用默认实现那样清除缓存区域。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412955.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号