当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

<b>在Hibernate中处理批量更新和批量删除</b>[Java编程]

赞助商链接



  本文“<b>在Hibernate中处理批量更新和批量删除</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

批量更新是指在一个事件中更新大批量数据,批量删除是指在一个事件中删除大批量数据.以下程序直接通过Hibernate API批量更新CUSTOMERS表中年纪大于零的全部记录的AGE字段:

tx = session.beginTransaction();
Iterator customers=session.find("from Customer c where c.age>0").iterator();
while(customers.hasNext()){
Customer customer=(Customer)customers.next();
customer.setAge(customer.getAge()+1);
}
tx.commit();
session.close();

假如CUSTOMERS表中有1万条年纪大于零的记录,那么Session的find()办法会一下子加载1万个Customer对象到内存.当履行tx.commit()办法时,会清理缓存,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) 占用大量内存,必须把1万个Customer对象先加载到内存,然后一一更新它们.

(2) 履行的update语句的数目太多,每个update语句只能更新一个Customer对象,必须通过1万条update语句才能更新一万个Customer对象,频繁的拜候数据库,会大大降低利用的性能.

为了疾速释放1万个Customer对象占用的内存,可以在更新每个Customer对象后,就调用Session的evict()办法当即释放它的内存:

tx = session.beginTransaction();
Iterator customers=session.find("from Customer c where c.age>0").iterator();
while(customers.hasNext()){
Customer customer=(Customer)customers.next();
customer.setAge(customer.getAge()+1);
session.flush();
session.evict(customer);
}
tx.commit();
session.close();

在以上程序中,改正了一个Customer对象的age属性后,就当即调用Session的flush()办法和evict()办法,flush()办法使Hibernate立即按照这个Customer对象的状况改变同步更新数据库,从而当即履行相关的update语句;evict()办法用于把这个Customer对象从缓存中排除出去,从而及时释放它占用的内存.

但evict()办法只能略微提高批量操作的性能,因为不管有没有利用evict()办法,Hibernate都必须履行1万条update语句,才能更新1万个Customer对象,这是影响批量操作性能的重要因素.假定Hibernate能直接履行以下SQL语句:

update CUSTOMERS set AGE=AGE+1 where AGE>0;

那么以上一条update语句就可以更新CUSTOMERS表中的1万条记录.但是Hibernate并没有直接供应履行这种update语句的接口.利用程序必须绕过Hibernate API,直接通过JDBC API来履行该SQL语句:

tx = session.beginTransaction();
Connection con=session.connection();
PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGE=AGE+1 "
+"where AGE>0 ");
stmt.executeUpdate();
tx.commit();

以上程序演示了绕过Hibernate API,直接通过JDBC API拜候数据库的历程.利用程序通过Session的connection()办法得到该Session利用的数据库衔接,然后通过它成立PreparedStatement对象并履行SQL语句.值得注意的是,利用程序仍旧通过Hibernate的Transaction接口来声明事件边界.

假如底层数据库(如Oracle)支持存储历程,也可以通过存储历程来履行批量更新.存储历程直接在数据库中运行,速度越发快.在Oracle数据库中可以定义一个名为batchUpdateCustomer()的存储历程,代码以下:

create or replace procedure batchUpdateCustomer(p_age in number) as
begin
update CUSTOMERS set AGE=AGE+1 where AGE>p_age;
end;


  以上是“<b>在Hibernate中处理批量更新和批量删除</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .