批量插入、更新和删除

14.3.2    批量插入、更新和删除

       在进行大批量数据操作的时候,如果处理不当,很可能会出现执行效率低下的情况。下面首先来介绍一下批量插入数据时应该注意的问题。

14.3.2.1    批量插入数据

       在项目开发中,经常会遇到需要向数据库中一次插入大量数据的时候,如果在开发中一味地调用Session对象的save()方法向数据库中保存对象,那么就很可能会出现OutOfMemoryError(内存溢出)异常。

       之所以出现这种情况是由于Hibernate缓存的影响。由于Hibernate的一级缓存是由Hibernate自己进行管理的,并且只会存在于内存中,所以,在调用save()方法的时候会将所保存的对象都缓存起来,这样当数量巨大的时候就会出现内存溢出的情况了。

       为了避免内存溢出情况的发生,需要在调用save()方法的同时,阶段性地刷新和清空一级缓存。具体的处理方法请参考14.2.2节中的介绍。

       虽然通过设置可以使二级缓存不会发生溢出,但在进行大批量的插入操作时,最好还是要禁用二级缓存,毕竟将对象保存到二级缓存是要耗费一定时间的,在禁用二级缓存后可以避免录入大量数据所带来的性能问题。

14.3.2.2    批量修改和删除

       在Hibernate 2中,如果需要对任何数据进行修改和删除操作,都需要先执行查询操作,在得到要修改或者删除的数据后,再对该数据进行相应的操作处理。在数据量少的情况下采用这种处理方式没有问题,但需要处理大量数据的时候就可能存在以下的问题:

●   占用大量的内存。

●   需要多次执行update/delete语句,而每次执行只能处理一条数据。

       以上两个问题的出现会严重影响系统的性能。因此,在Hibernate 3中引入了用于批量更新或者删除数据的HQL语句。这样,开发人员就可以一次更新或者删除多条记录,而不用每次都一个一个地修改或者删除记录了。

       如果要删除所有的User对象(也就是User对象所对应表中的记录),则可以直接使用下面的HQL语句:

       delete User

       而在执行这个HQL语句时,需要调用Query对象的executeUpdate()方法,具体的实例如下所示:

String HQL="delete User";

Query query=session.createQuery(HQL);

int size=query.executeUpdate();

       采用这种方式进行数据的修改和删除时与直接使用JDBC的方式在性能上相差无几,是推荐使用的正确方法。

       如果不能采用HQL语句进行大量数据的修改,也就是说只能使用取出再修改的方式时,也会遇到批量插入时的内存溢出问题,所以也要采用上面所提供的处理方法来进行类似的处理。

14.3.2.3    使用SQL执行批量操作

       在进行批量插入、修改和删除操作时,直接使用JDBC来执行原生态的SQL语句无疑会获得最佳的性能,这是因为在处理的过程中省略或者简化了以下处理内容:

●   HQL语句到SQL语句的转换。

●   Java对象的初始化。

●   Java对象的缓存处理。

       但是在直接使用JDBC执行SQL语句时,有一个最重要的问题就是要处理缓存中的Java对象。因为通过这种底层方式对数据的修改将不能通知缓存去进行相应的更新操作,以保证缓存中的对象与数据库中的数据是一致的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值