码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate 二级缓存疑难点

时间:2017-01-22 11:50:14      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:nbsp   数据   etc   情况   png   循环   create   9.png   set   

  1. 一级缓存:缓存实体
  2. 二级缓存:缓存实体
  3. Hibernate查询缓存缓存的是查询出来的实体的部分属性结果集和实体的ID(注意这里不是实体)。
  4. 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 二级缓存疑难点

标签:nbsp   数据   etc   情况   png   循环   create   9.png   set   

原文地址:http://www.cnblogs.com/tianyuchen/p/6323120.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!