<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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |