




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9.4 批量处理数据通常,在一个Session对象的缓存中只存放数量有限的持久化对象,等到Session对象处理事务完毕,还要关闭Session对象,从而及时释放Session的缓存占用的内存。批量处理数据是指在一个事务中处理大量数据。以下程序在一个事务中批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段:Transaction tx = session.beginTransaction();Iterator customers=session.createQuery(from Customer c where c.age0).list().iterator();while(customers.hasNext()Customer customer=(Customer)customers.next();customer.setAge(customer.getAge()+1); mit();session.close();如果CUSTOMERS表中有1万条年龄大于零的记录,那么Hibernate会一下子加载1万个Customer对象到内存。当执行mit()方法时,会清理缓存,Hibernate执行1万条更新CUSTOMERS表的update语句:update CUSTOMERS set AGE=? . where ID=i;update CUSTOMERS set AGE=? . where ID=j;update CUSTOMERS set AGE=? . where ID=k;以上批量更新方式有两个缺点:占用大量内存,必须把1万个Customer对象先加载到内存,然后一一更新它们。执行的update语句的数目太多,每个update语句只能更新一个Customer对象,必须通过1万条update语句才能更新1万个Customer对象,频繁地访问数据库,会大大降低应用的性能。一般说来,应该尽可能避免在应用层进行批量操作,而应该在数据库层直接进行批量操作,例如直接在数据库中执行用于批量更新或删除的SQL语句,如果批量操作的逻辑比较复杂,则可以通过直接在数据库中运行的存储过程来完成批量操作。并不是所有的数据库系统都支持存储过程。例如目前的MySQL就不支持存储过程,因此不能通过存储过程来进行批量更新或批量删除。当然,在应用层也可以进行批量操作,主要有以下方式:(1)通过Session来进行批量操作。(2)通过StatelessSession来进行批量操作。(3)通过HQL来进行批量操作。(4)直接通过JDBC API来进行批量操作。9.4.1 通过Session来进行批量操作Session的save()以及update()方法都会把处理的对象存放在自己的缓存中。如果通过一个Session对象来处理大量持久化对象,应该及时从缓存中清空已经处理完毕并且不会再访问的对象。具体的做法是在处理完一个对象或小批量对象后,立刻调用flush()方法清理缓存,然后再调用clear()方法清空缓存。通过Session来进行批量操作会受到以下约束:(1)需要在Hibernate的配置文件中设置JDBC单次批量处理的数目,合理的取值通常为10到50之间,例如:hibernate.jdbc.batch_size=20在按照本节介绍的方法进行批量操作时,应该保证每次向数据库发送的批量SQL语句数目与这个batch_size属性一致。(2)如果对象采用identity标识符生成器,则Hibernate无法在JDBC层进行批量插入操作。(3)进行批量操作时,建议关闭Hibernate的第二级缓存。本书的姊妹篇精通Hibernate:高级篇对第二级缓存做了详细介绍。Session的缓存为Hibernate的第一级缓存,通常它是事务范围内的缓存,也就是说,每个事务都有单独的第一级缓存。SessionFactory的外置缓存为Hibernate的第二级缓存,它是应用范围内的缓存,也就是说,所有事务都共享同一个第二级缓存。在任何情况下,Hibernate的第一级缓存总是可用的。而默认情况下,Hibernate的第二级缓存是关闭的,此外也可以在Hibernate的配置文件中通过如下方式显式关闭第二级缓存:hibernate.cache.use_second_level_cache=false1批量插入数据以下代码一共向数据库中插入十万条CUSTOMERS记录,单次批量插入20条CUSTOMERS记录:Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();for ( int i=0; i1;int createdEntities = s.createQuery( hqlInsert ).executeUpdate();mit();session.close();以上程序代码向数据库提交的SQL语句为:insert into DELINQUENT_ACCOUNTS(ID,NAME) select ID,NAME from CUSTOMERS where ID19.4.4 直接通过JDBC API来进行批量操作当通过JDBC API来执行SQL insert、update和delete语句时,SQL语句中涉及到的数据不会被加载到内存中,因此不会占用内存空间。以下程序直接通过JDBC API来执行用于批量更新的SQL语句:Transaction tx = session.beginTransaction();/获得该Session使用的数据库连接java.sql.Connection con=session.connection();/通过JDBC API执行用于批量更新的SQL语句PreparedStatement stmt=con.prepareStatement(update CUSTOMERS set AGE=AGE+1 +where AGE0 );stmt.executeUpdate();mit();以上程序通过Session的connection()方法获得该Session使用的数据库连接,然后通过它创建PreparedStatement对象并执行SQL语句。值得注意的是,应用程序仍然通过Hibernate的Transaction接口来声明事务边界。值得注意的是,在Hibernate3中,尽管Session的connection()方法还存在,但是已经被废弃,不提倡使用了,不过Hibernate3提供了替代方案:org.hibernate.jdbc.Work接口表示直接通过JDBC API来访问数据库的操作,Work接口的execute()方法用于执行直接通过JDBC API来访问数据库的操作:public interface Work /直接通过JDBC API来访问数据库的操作public void execute(Connection connection) throws SQLException;Session的doWork(Work work)方法用于执行Work对象指定的操作,即调用Work对象的execute()方法。Session会把当前使用的数据库连接传给execute()方法。以下程序演示了通过Work接口以及Session的doWork()方法来执行批量操作的过程:Transaction tx=session.beginTransaction();/定义一个匿名类,实现了Work接口Work work=new Work()public void execute(Connection connection)throws SQLException/通过JDBC API执行用于批量更新的SQL语句PreparedStatement stmt=connection.prepareStatement(update CUSTOM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 时间的脚步课件
- 时间沈从文句子课件
- 小学语文板书培训
- 2025版农业科技孵化基地入驻项目合作协议
- 二零二五版法人股份转让与员工激励计划协议
- 二零二五年度城市轨道交通截桩施工合同
- 二零二五版农业科技推广与应用服务合同
- 2025版办公室装修工程合同范本
- 二零二五年度矿山地质勘查服务合同汇编
- 二零二五年度金融理财产品购销合同范本
- 知识题库-人社练兵比武竞赛测试题及答案(五)
- 多功能报告厅设计
- 五年级上册科学青岛版全册教案
- 出入境证件承诺书
- 合理膳食 均衡营养课件
- 医院科教科主任竞聘演讲稿课件
- 建筑装饰施工技术课件
- 《公路桥涵养护规范》(5120-2021)【可编辑】
- 医院科研诚信管理办法范例
- 乳腺钼靶诊断分级标准
- 班组长能力提升角色认知课件
评论
0/150
提交评论