`
nlslzf
  • 浏览: 1048780 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Hibernate应用中如何处理批量更新和批量删除

阅读更多
http://www.javaresearch.org/article/53668.htm


批量更新是指在一个事务中更新大批量数据,批量删除是指在一个事务中删除大批量数据。以下程序直接通过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; 


以上存储过程有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:
代码内容
tx = session.beginTransaction(); 
Connection con=session.connection(); 
String procedure = "{call batchUpdateCustomer(?) }"; 
CallableStatement cstmt = con.prepareCall(procedure); 
cstmt.setInt(1,0); //把年龄参数设为0 
cstmt.executeUpdate(); 
tx.commit(); 

从上面程序看出,应用程序也必须绕过Hibernate API,直接通过JDBC API来调用存储过程。
Session的各种重载形式的update()方法都一次只能更新一个对象,而delete()方法的有些重载形式允许以HQL语句作为参数,例如:

代码内容
session.delete("from Customer c where c.age>0"); 


如果CUSTOMERS表中有1万条年龄大于零的记录,那么以上代码能删除一万条记录。但是Session的delete()方法并没有执行以下delete语句

代码内容
delete from CUSTOMERS where AGE>0; 


Session的delete()方法先通过以下select语句把1万个Customer对象加载到内存中:

代码内容
select * from CUSTOMERS where AGE>0; 


接下来执行一万条delete语句,逐个删除Customer对象:

代码内容
delete from CUSTOMERS where ID=i; 
delete from CUSTOMERS where ID=j; 
delete from CUSTOMERS where ID=k; 


由此可见,直接通过Hibernate API进行批量更新和批量删除都不值得推荐。而直接通过JDBC API执行相关的SQL语句或调用相关的存储过程,是批量更新和批量删除的最佳方式,这两种方式都有以下优点:

(1) 无需把数据库中的大批量数据先加载到内存中,然后逐个更新或修改它们,因此不会消耗大量内存。
(2) 能在一条SQL语句中更新或删除大批量的数据。
分享到:
评论

相关推荐

    在Hibernate应用中处理批量更新和批量删除

    然而,在处理大量数据时,如何有效地执行批量更新和批量删除操作成为了许多开发者面临的挑战。本文将深入探讨在Hibernate应用中处理批量更新和批量删除的最佳实践,以及如何避免常见的性能陷阱。 ### 一、批量更新...

    在Hibernate中处理批量更新和批量删除

    然而,在处理大量数据时,如何有效地进行批量更新和批量删除操作,是每一个开发者都可能遇到的挑战。本文将深入探讨在Hibernate中处理批量更新和批量删除的策略,以及如何优化这些操作,以提高数据库操作的效率。 #...

    hibernate批量删除

    在Java开发中,处理大量数据时,经常需要执行批量操作,如批量更新或批量删除。这些操作对于提高应用程序性能至关重要,尤其是在涉及成千上万条记录的情况下。Hibernate作为一款流行的Java持久层框架,支持通过其...

    jsp Hibernate批量更新和批量删除处理代码

    在JSP与Hibernate结合使用的环境下,批量更新和批量删除操作需要特别注意性能问题。通过合理利用Hibernate的会话缓存机制、手动提交与清理策略、直接使用JDBC API或通过存储过程调用数据库原生批量操作,可以有效...

    jsp Hibernate批量更新和批量删除处理代码.docx

    总结来说,批量更新和批量删除是提升Hibernate应用性能的关键技巧。通过合理利用`flush()`、`evict()`以及直接使用JDBC执行SQL,可以有效地处理大数据量的更新和删除操作,降低内存占用并减少对数据库的访问次数。在...

    JSF+hibernate实现批量删除

    本篇文章将详细探讨如何利用JSF与Hibernate相结合来实现批量删除功能,以及在CRUD(创建、读取、更新和删除)操作中的应用。 首先,我们需要理解JSF的工作原理。JSF是一个基于组件的MVC(Model-View-Controller)...

    struts2 hibernate spring 整合批量删除源码

    在批量删除场景下,Hibernate可以用于查询和删除数据库中的多条记录。开发者通常会定义一个DAO(Data Access Object)接口,该接口包含批量删除的方法,然后由Hibernate的Session实现这个接口,执行SQL删除语句。...

    Hibernate批量处理

    批量处理对于需要在短时间内处理大量数据的应用尤其重要,如批量更新、批量插入或批量删除等场景。 #### 二、批量处理的必要性 在实际开发过程中,当需要处理大量数据时,传统的逐条处理方式不仅占用大量的内存...

    Hibernate批量处理数据

    因此,本文将详细介绍Hibernate如何高效地进行批量数据处理,包括批量插入、批量更新和批量删除。 #### 二、批量插入 在批量插入数据时,直接使用循环逐一保存的方式容易导致内存溢出。这是因为Hibernate的Session...

    hibernate批量删除.txt

    在进行数据库操作时,经常会遇到需要批量处理数据的情况,例如批量更新或批量删除等。利用Hibernate框架可以方便地实现这些功能,提高开发效率并减少资源消耗。本文将详细介绍如何通过Hibernate进行批量删除,并探讨...

    浅析Hibernate下数据批量处理方法.doc

    对于批量更新和删除操作,可以使用`scroll()`方法配合查询命名(NamedQuery),以滚动结果集的方式处理数据。这样可以在遍历数据的同时,分批处理并提交事务,同样通过调用`flush()`和`clear()`来管理内存。 然而,...

    HQL批量插入、更新和删除

    - **批量删除**:对于批量删除操作,可以使用HQL的`DELETE`语句。例如,要删除所有状态为“无效”的用户记录,可以执行如下HQL语句: ```java String hql = "DELETE User WHERE status = :status"; Query query =...

    Hibernate批量更新与删除实例浅析

    在Java的软件开发中,Hibernate是一个...总结起来,Hibernate虽然提供了面向对象的便捷操作,但在处理批量更新和删除时,可能需要结合JDBC API来优化性能。理解和掌握这些技巧对于开发高效、大规模的Java应用至关重要。

    SSH 全选反选批量删除

    在"SSH全选反选批量删除"的场景中,我们主要讨论的是如何通过SSH框架实现用户界面的批量操作,如全选、反选和删除功能,同时结合MySQL数据库进行数据处理。 首先,Spring作为核心容器,负责管理应用对象(如DAO、...

    ssh整合的分页、批量删除

    在IT行业中,SSH整合是指Spring、Struts和Hibernate三个开源框架的集成,它们共同构建了一个强大的企业级应用开发平台。Spring提供了依赖注入和面向切面编程,Struts处理MVC模式,而Hibernate则是ORM(对象关系映射...

    hibernateTemplate批量删除数据

    在IT领域的软件开发中,尤其是基于Java的企业级应用开发中,Hibernate作为一个强大的对象关系映射(ORM)框架,被广泛应用于持久层的数据处理。本文将深入探讨如何利用Hibernate中的`HibernateTemplate`类进行批量...

    Java Hibernate3 添加和删除数据

    在实际应用中,为了提高性能和防止脏读,通常会使用批处理操作,比如批量添加或删除。此外,还可以利用Criteria或HQL(Hibernate Query Language)进行更复杂的查询操作。 总的来说,Java Hibernate3简化了数据库...

    hql批量删除

    与Hibernate的Session.delete()方法相比,通过JDBC API执行批量删除、更新和插入操作时,SQL语句中的数据不会被加载到内存中,从而不会占用额外的内存空间。 在Hibernate中,可以使用java.sql.Connection对象来创建...

    Hibernate

    本文将深入探讨在Hibernate框架下,如何有效地处理大规模数据的批量插入、更新和删除操作。 #### 批量数据插入 传统的Hibernate数据插入方式往往采用单次插入单个实体对象的方式,这在处理小规模数据时效率尚可,...

    java数据批量处理

    在Java编程领域,数据批量处理是一项常见的任务,尤其在大数据、数据库操作以及系统集成等场景中,批量处理能显著提高效率并减少资源消耗。...在实际应用中,还需结合业务需求和资源限制,不断调整和优化处理策略。

Global site tag (gtag.js) - Google Analytics