知识大全 Hibernate批量更新与删除实例浅析

Posted 语句

篇首语:无论你有多少知识,假如不用便是一无所知。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate批量更新与删除实例浅析相关的知识,希望对你有一定的参考价值。

Hibernate批量更新与删除实例浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在我们的Java项目中 批量更新是指在一个事务中更新大批量数据 批量删除是指在一个事务中删除大批量数据 批量删除虽然在Hibernate里也可以实现 但因Hibernate的实现机制是一个一个删除 在数量大的情况下很影响效率;其实Hibernate提供的JDBC接口 可以方便的进行批量的更新和删除

  以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段

  tx = session beginTransaction();

  Iterator customers=session find( from Customer c where c age> erator();

  while(customers hasNext())Customer customer=(Customer)customers next();

  customer setAge(customer getAge()+ );

  

  mit();

  session close();

  如果CUSTOMERS表中有 万条年龄大于零的记录 那么Session的find()方法会一下子加载 万个Customer对象到内存 当执行mit()方法时 会清理缓存 Hibernate执行 万条更新CUSTOMERS表的update语句

  update CUSTOMERS set AGE=? … where ID=i;

  update CUSTOMERS set AGE=? … where ID=j;

  ……

  update CUSTOMERS set AGE=? … where ID=k;

  以上批量更新方式有两个缺点

  ( )占用大量内存 必须把 万个Customer对象先加载到内存 然后一一更新它们

  ( )执行的update语句的数目太多 每个update语句只能更新一个Customer对象 必须通过 万条update语句才能更新一万个Customer对象 频繁的访问数据库 会大大降低应用的性能

  为了迅速释放 万个Customer对象占用的内存 可以在更新每个Customer对象后 就调用Session的evict()方法立即释放它的内存

  tx = session beginTransaction();

  Iterator customers=session find( from Customer c where c age> erator();

  while(customers hasNext())Customer customer=(Customer)customers next();

  customer setAge(customer getAge()+ );

  session flush();session evict(customer);

  

  mit();session close();

  在以上程序中 修改了一个Customer对象的age属性后 就立即调用Session的flush()方法和evict()方法 flush()方法使Hibernate立刻根据这个Customer对象的状态变化同步更新数据库 从而立即执行相关的update语句;evict()方法用于把这个Customer对象从缓存中清除出去 从而及时释放它占用的内存

  但evict()方法只能稍微提高批量操作的性能 因为不管有没有使用evict()方法 Hibernate都必须执行 万条update语句 才能更新 万个Customer对象 这是影响批量操作性能的重要因素 假如Hibernate能直接执行如下SQL语句

  update CUSTOMERS set AGE=AGE+ where AGE> ;

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

  tx = session beginTransaction();

  Connection con=nnection();

  PreparedStatement stmt=con prepareStatement( update CUSTOMERS set AGE=AGE+ + where AGE> );stmt executeUpdate();

  mit();

  以上程序演示了绕过Hibernate API 直接通过JDBC API访问数据库的过程 应用程序通过Session的connection()方法获得该Session使用的数据库连接 然后通过它创建PreparedStatement对象并执行SQL语句 值得注意的是 应用程序仍然通过Hibernate的Transaction接口来声明事务边界

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

  create or replace procedure batchUpdateCustomer(p_age in number)

  asbeginupdate CUSTOMERS

  set AGE=AGE+ where AGE>p_age;

  end;

  以上存储过程有一个参数p_age 代表客户的年龄 应用程序可按照以下方式调用存储过程

  tx = session beginTransaction();

  Connection con=nnection();

  String procedure = call batchUpdateCustomer(?) ;

  CallableStatement cstmt = con prepareCall(procedure);cstmt setInt( ); //把年龄参数设为 cstmt executeUpdate();

  mit();

  从上面程序看出 应用程序也必须绕过Hibernate API 直接通过JDBC API来调用存储过程

  Session的各种重载形式的update()方法都一次只能更新一个对象 而delete()方法的有些重载形式允许以HQL语句作为参数 例如

  session delete( from Customer c where c age> );

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

  delete from CUSTOMERS where AGE> ;

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

  select * from CUSTOMERS where AGE> ;

  接下来执行一万条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语句或调用相关的存储过程 是批量更新和批量删除的最佳方式 这两种方式都有以下优点

  ( )无需把数据库中的大批量数据先加载到内存中 然后逐个更新或修改它们 因此不会消耗大量内存

cha138/Article/program/Java/ky/201311/27864

相关参考

知识大全 Oracle中的Merge函数(批量更新/删除)

Oracle中的Merge函数(批量更新/删除)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 DataAdapter执行批量更新的实例代码

DataAdapter执行批量更新的实例代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!这篇文章

知识大全 hibernate优化方案

  一批量修改和删除  在Hibernate中如果需要对任何数据进行修改和删除操作都需要先执行查询操作在得到要修改或者删除的数据后再对该数据进行相应的操作处理在数据量少的情况下采用这种处理方式没有问题

知识大全 sql update 语法与实例

  sqlupdate语法与实例  在日常使用的数据库教程是一个不断变化的数据存储在SQL是用于修改数据已经在数据库中的更新和删除mandsThe更新语句可以更新表格中的一个或多个记录命令  UPDA

知识大全 asp 保存数据与批量删除数据方法

  文章来提供一篇asp教程保存数据与批量删除数据方法哦在asp中保存数据到数据库教程也有很多种方法我们只说了二种同时删除数据也有很多方法单条删除批量删除会用到forin来实现  注意不同的字段名用英

知识大全 Hibernate的批量处理-批量插入

Hibernate的批量处理-批量插入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiber

知识大全 Hibernate的批量处理

Hibernate的批量处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hibernate批

知识大全 简单概括Hibernate批量操作

简单概括Hibernate批量操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiberna

知识大全 Hibernate的批量处理[1]

Hibernate的批量处理[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiberna

知识大全 Hibernate的批量处理[3]

Hibernate的批量处理[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  设置hiber