Hibernate 二级缓存疑难点
- 一级缓存:缓存实体
- 二级缓存:缓存实体
- Hibernate查询缓存缓存的是查询出来的实体的部分属性结果集和实体的ID(注意这里不是实体)。
- Hibernate查询缓存:对List起作用。但是Hibernate查询缓存对Iterator不起作用,只对List起作用。
Iterator不考虑缓存,必会执行,且仅查询出实体id的集合。
Iterator iter = session.createQuery("from GoUser").iterate();
for(;iter.hasNext();){
GoUser u = (GoUser) iter.next();
System.out.println(u.getName());
}
说明:Iterator这种方式会得到实体的id集合,查询实体的具体属性时会重新向数据库发出请求。
如果开启二级缓存,循环遍历时二级缓存会将实体保存。
关闭二级缓存,开启查询缓存的情况下
Session session = sf.openSession();
session.beginTransaction();
List<User> list = (List<User>) session.createQuery("from User")
.setCacheable(true).list();
for (User u : list) {
System.out.println(u.getName());
}
session.getTransaction().commit();
session.close();
System.out.println("-----------------分割线------------------");
Session session2 = sf.openSession();
session2.beginTransaction();
List<User> list2 = (List<User>) session2.createQuery("from User")
.setCacheable(true).list();
for (User u : list2) {
System.out.println(u.getName());
}
session2.getTransaction().commit();
session2.close();
执行结果:

说明:
关闭二级缓存,开启查询缓存的情况下,第一次list查询,将所有实体的属性信息查询出来,只执行了一条语句,然后仅保存了实体id的列表,所以第二次查询时,由查询缓存中的id去数据库中取实体数据。
二级缓存、查询缓存都开启的情况下
代码如上例
执行结果:

说明:
二级缓存和查询缓存都开启的情况下,由于查询语句相同,则从查询缓存中查找对应的id集合,然后根据id再从二级缓存中查找对应的实体,所以只执行一次数据库操作。
Hibernate 二级缓存疑难点的更多相关文章
- Hibernate 二级缓存 总结整理(转)
和<Hibernate 关系映射 收集.总结整理> 一样,本篇文章也是我很早之前收集.总结整理的,在此也发上来 希望对大家有用.因为是很早之前写的,不当之处请指正. 1.缓存:缓存是什么, ...
- Hibernate二级缓存 --Hibernate框架
Hibernate本身只提供了二级缓存的规范,但并未实现,所以需要第三方缓存插件的支持.常用的二级缓存第三方插件有:EHCache.Memcached.OSCache.SwarmCache.JBoss ...
- Hibernate ——二级缓存
一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...
- 配置Hibernate二级缓存时,不能初始化RegionFactory的解决办法
配置Hibernate 二级缓存时,出现以下bug提示: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&quo ...
- 配置Hibernate二级缓存步骤
配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...
- 建立Hibernate二级Cache
建立Hibernate二级Cache它需要两个步骤:首先,一定要使用什么样的数据并发策略,然后配置缓存过期时间,并设置Cache提供器. 有4种内置的Hibernate数据并发冲突策略,代表数据库隔离 ...
- Hibernate(十六):Hibernate二级缓存
Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如磁盘上的文件或者数据库)之间,起作用是降低应用程序直接读取永久性数据存储源的频率,从而提高应用 ...
- hibernate二级缓存demo2
@Test public void hello3(){ Session session=sessionFactory.openSession(); List list = session.create ...
- hibernate二级缓存整合
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http:// ...
随机推荐
- 使用Visual Studio 2013进行单元测试
使用Visual Studio 2013进行单元测试 1.打开VS2013 --> 新建一个项目.这里我们默认创建一个控制台项目.取名为UnitTestDemo 2.在解决方案里面新增一个单元测 ...
- ELK 性能(2) — 如何在大业务量下保持 Elasticsearch 集群的稳定
ELK 性能(2) - 如何在大业务量下保持 Elasticsearch 集群的稳定 介绍 如何在大业务量下保持 Elasticsearch 集群的稳定? 内容 当我们使用 Elasticsearch ...
- FINAL视频预发布
视频地址:http://v.youku.com/v_show/id_XMTg0MjMzNDIwNA==.html?spm=a2hzp.8253869.0.0&from=y1.7-2
- convert函数语法
convert函数语法: CONVERT(data_type(length), data_to_be_converted, style)data_type(length) 规定目标数据类型(带有可 ...
- spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql
spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql
- Day23-Model操作和Form操作-转载
参考出处: http://blog.csdn.net/fgf00/article/details/54614706 Model和Form以及ModelForm简介 Model操作: 创建数据库表结构 ...
- bzoj1485: [HNOI2009]有趣的数列(Catalan数)
一眼卡特兰数...写完才发现不对劲,样例怎么输出$0$...原来模数不一定是质数= =... 第一次见到模数不是质数的求组合数方法$(n,m\leq 10^7)$,记录一下... 先对于$1$~$n$ ...
- Java中如何遍历Map对象
方法一:使用map.entrySet()来遍历.这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要的时候使用. Map<String,String> map = new Ha ...
- 浮动和margin-left负值的有趣现象
我将第二个浮动的元素的margin-left的值不断减小: 被设置元素左移,后面的元素跟着动 当被设置元素的右边界超过了前面元素的左边界,后面边的元素被前面的元素挡在外面了
- openstack项目【day23】:虚拟化介绍
本节内容 一 什么是虚拟化 二 为何要学习虚拟化 三 虚拟化技术主要分类(了解) 四 平台虚拟化技术又可以细分(了解) 一 什么是虚拟化 虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让 ...