快速业务通道

hibernate3学习笔记(二十二)|Query缓存机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
SessionFactory sessionFactory = config.buildSessionFactory(); 20. Session session = sessionFactory.openSession();21. 22.23. String hql = "from com.hb3.pack_22.model.User";24.25. Query query = session.createQuery(hql);26. //使用Query快取 27. query.setCacheable(true);28. List<?> users = query.list();29.30. for(int i = 0; i < users.size(); i++) {31. User user = (User) users.get(i);32. System.out.println(user.getName());33. }34.35. query = session.createQuery(hql);36. //使用Query快取 37. query.setCacheable(true);38. users = query.list();39.40. for(int i = 0; i < users.size(); i++) {41. User user = (User) users.get(i);42. System.out.println(user.getName());43. }44. 45. 46. session.close();47. sessionFactory.close();48. }49.}

hibernate3学习笔记(二十二)|Query缓存机制(3)

时间:2011-02-03

执行结果为:

Hibernate: select user0_.id as id0_, user0_.name as name0_, user0_.room_id as room3_0_ from user user0_ chenyan shenbin chenyan shenbin

其实,Hibernate在启用Query的缓存机制后,会保留执行过的查询SQL和查询结果,在下次查询后会看看SQL是否相同,并看看对应的资料库表格是否有变动(Update/Delete/Insert),如果SQL相同且且资料库也没有变动则将缓存中的结果直接返回。

值得一提的是,Query上有list()与iterator()2个方法用于结果集返回。他们的区别是,list()方法在读取数据库时不会使用缓存机制而直接向数据库发起查询,而iterator()则会将读取到的结果写到缓存中,以便于读取时再次利用。

1.Session session = sessionFactory.openSession();2.3.Query query = session.createQuery("from User");4.List users = query.list();5.users = query.list();6.7.session.close();

执行结果:

Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_ from user user0_Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_ from user user0_

1.Session session = sessionFactory.openSession(); 2. 3.Query query = session.createQuery("from User"); 4.Iterator users = query.iterate(); 5.users = query.iterate(); 6. 7.session.close();

执行结果:

Hibernate: select user0_.id as col_0_0_ from user user0_ Hibernate: select user0_.id as col_0_0_ from user user0_

由于使用iterator()方法时会使用到Session level缓存,所以在查询大量记录时会好用大量的记忆体。必要时可以使用Session的evict()或clear()方法来清除缓存。

请参阅:http://blogger.org.cn/blog/more.asp?name=NaddyLee&id=31540

请注意,尽管iterator()方法时会使用到Session level缓存,但这不能就说在任何情况下都是最有效率的做法。

hibernate3学习笔记(二十二)|Query缓存机制(4)

时间:2011-02-03

请看下面的测试:

1.package com.hb3.pack_22;2.3.import java.io.IOException;4.import java.sql.SQLException;5.import java.util.Iterator;6.import java.util.List;7.
8.import org.hibernate.Query;9.import org.hibernate.Session;10.import org.hibernate.SessionFactory;11.import org.hibernate.cfg.Configuration;12.
13.import com.hb3.pack

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号