标签:nbsp 数据 etc 情况 png 循环 create 9.png set
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再从二级缓存中查找对应的实体,所以只执行一次数据库操作。
标签:nbsp 数据 etc 情况 png 循环 create 9.png set
原文地址:http://www.cnblogs.com/tianyuchen/p/6323120.html