Hibernate3.0中的session.find()问题
我被Session.find()的方法困扰了好几天,今天才看到新的Hibernate里没有了Session.find()方法。
 现在转载在此,方便你我。
查询性能往往是系统性能表现的一个重要方面,查询机制的优劣很大程度上决定了系统的整体性能。这个领域往往也存在最大的性能调整空间。
hibernate2中Session.find()对应于3中的session.createQuery().list();
 hibernate2中Session.iterate()对应于3中的session.createQuery().iterate();
 find和iterate区别:
 find方法通过一条Select SQL实现了查询操作,而iterate方法要执行多条Select SQL.
 iterate第一次查询获取所有符合条件的记录的id,然后再根据各个id从库表中读取对应的记录,这是一个典型的N+1次的查询问题,如果符合条件记录有10000条,就需要执行10001条Select SQL,可想性能会如何的差。
那为什么要提供iterator方法,而不只是提供高效率的find方法?
原因1.与hibernate缓存机制密切相关
 find方法实际上是无法利用缓存的,它对缓存只写不读。
 find方法只执行一次SQL查询,它无法判断缓存中什么样的数据是符合条件的,也无法保证查询结果的完整性。而iterate方法,会首先查询所有符合条件记录的id,然后根据id去缓存中找,如果缓存中有该id,就返回,没有可以根据id再去数据库查询。
 String hql = "from TUser where age > ?";
 List userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
 Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER);
 顺序执行,iterate方法只会执行一次SQL查询,就是查找id,然后根据id就可以从缓存中获得数据。
String hql = "from TUser where age > ?";
 List userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
 userList = session.find(hql, new Integer(18), Hibernate.INTEGER);
 缓存是不起作用的。
 如果目标数据读取相对较为频繁,通过iterate这种机制,会减少性能损耗。
原因2.内存使用上的考虑
 find方法将一次获得的所有记录并将其读入内存。如果数据量太大,可能会触发OutOfMemoryError,从而导致系统异常。解决方案之一就是结合iterate方法和evict方法逐条对记录进行处理,将内存消化保持在一个可以接受的范围之内。如:
 String hql = "from TUser where age > ?";
 Iterator it = session.iterate(hql, new Integer(18), Hibernate.INTEGER);
 while(it.hasNext()) {
     TUser user = (TUser)it.next();
     
     //将对象从一级缓存中删除
     session.evict(user);
//二级缓存可以设定最大缓存量,达到后自动对较老数据进行废除,但也可以通过编
     //码移除,这样有助于保持数据有效性。
     sessionFactory.evict(TUser.class, user.getID());
 }
Hibernate3.0中的session.find()问题的更多相关文章
- EJB3.0中的session bean以及MDB解析
		
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/aboy123/article/details/24587133 大型业务系统面临的主要问题就是高并发 ...
 - MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题
		
///MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题,在webconfig中配置<system.web><authentication mode ...
 - 注意在<s:if test="#session.user.power==0">中不能用 <s:if test=$sessionScope.user.power==0">
		
获取封装在session的对象 用#session.对象名,可以获取对象 用#session.对象名.属性,可以获取属性. 注意在<s:iftest="#session.user.po ...
 - Spring与Hibernate集成中的Session问题
		
主要讨论Spring与Hibernate集成中的session问题 1.通过getSession()方法获得session进行操作 public class Test extends Hibernat ...
 - day36 11-Hibernate中的事务:当前线程中的session
		
如果你没有同一个session开启事务的话,那它两是一个独立的事务.必须是同一个session才有效.它给我们提供一个本地线程的session.这个session就保证了你是同一个session.其实 ...
 - Tomcat中的Session小结
		
什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...
 - ASP.NET中的Session怎么正确使用
		
Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...
 - [转]tomcat中的session管理
		
转载地址:http://blog.csdn.net/iloveqing/article/details/1544958 当一个sesson开始时,Servlet容器会创建一个HttpSession对象 ...
 - ASP.NET中的Session怎么正确使用[转]
		
Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...
 
随机推荐
- 《浪潮之巅》完全系类——IT人士必读经典
			
浪潮之巅 第一章 帝国的余辉(AT&T) 浪潮之巅第二章 — 蓝色巨人(IBM) 浪潮之巅第三章 — “水果”公司的复兴 (乔布斯和苹果公司) 浪潮之巅第四章 — 计算机工业的生态链 浪潮之巅 ...
 - MySQL的备份与还原
			
原文:MySQL的备份与还原 MySQL备份和还原,都是利用mysqldump.mysql和source命令来完成的. 1.Win32下MySQL的备份与还原 1.1 备份 开始菜单 | 运行 | c ...
 - YUV格式转换RGB(基于opencv)
			
在编写代码将需要处理YUV格从每个视频帧中提取,然后将其保存为图片.有两种常见的方法在线,第一种是通过opencv自带cvCvtColor,可是这样的方法有bug.得到的图片会泛白.另外一种方法是公式 ...
 - jquery+ligerform三级联动下拉框
			
如下为ligerform里的三级联动下拉框: var formData=[ {display:,width:,space:,type:"select",group:"区域 ...
 - C# 对Outlook联系人的增、删、查 
			
原文:C# 对Outlook联系人的增.删.查 [转] 注:定义变量 Outlook.Application myOlApp = new Outlook.ApplicationClass(); Out ...
 - Python开发环境Wing IDE 5.0测试第八版发布
			
Wing IDE是著名的Python开发工具,是Wingware公司的主要产品.从1999年起,Wingware公司便开始专注于Python开发设计.Wing IDE在十几年的发展中,不管完善.其强大 ...
 - 安装Oracle 9i - 初学者系列  - 学习者系列文章
			
Oracle 9i数据库是经典的Oracle版本,就象SQL Server 2000一样.笔者最初使用到的Oracle版本就是Oracle 9i.下面就介绍下Oracle 9i的安装. 1. 下载O ...
 - java这些东西发展(4)-------无穷time of error
			
今天,有些郁闷的心情啊.空指针下午折磨.到现在为止仍然没有得到解决,专家的招募结果没拿到,我们必须继续自己的,进而改变一点点一点点地找到它,但现在我不想搞,准备回家,这浪费了一个多小时,之前记录的下一 ...
 - 生活小助手--Android项目
			
每次想做一个Android项目都不知道要怎么开始,所谓前期工作,都是辅助于项目能顺利完成而做的. 每一个项目开始都要有几首准备: 第一,项目要做什么? 第二,项目中有那些版块? 项目的概要设计 项目流 ...
 - knockout同时绑定多个实体demo
			
1.我们会遇到一种情景:一个页面实现复杂的功能时,我们往往会使用部分页(.netmvc中的@renderaction,java中ajax请求jsp页面). 如果子页面也使用knockout绑定数据会不 ...