Hibernate 二级缓存疑难点
Posted 芭蕉扇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 二级缓存疑难点的主要内容,如果未能解决你的问题,请参考以下文章