论坛首页 Java企业应用论坛

Hibernate的批量删除的效率分析

浏览 33074 次
该帖已经被评为精华帖
作者 正文
   发表时间:2003-09-16  
Hibernate作为ORM,有一个ORM固有的问题,就是由于为了持久对象的同步,不能够使用批量删除和批量更新的sql,只能按照主键一条条来操作。因此效率相对JDBC来说是比较低的。然而事情也并不总是那么绝望,只要你对Hibernate进行优化,也可以得到相当满意的速度。

 session.delete("from Cat as c where ...");;


该语句实际上发送sql:
==> select id,name,sex,weight from cat;
==> delete from cat where id = ?


Hibernate先查询数据,确实要消耗一些时间,但是select只读操作和insert,delete,update这些数据库修改操作在速度上有一个以上的数量级的差距。所以 Hibernate虽然查询数据要多耗时,但是消耗的这点时间影响不是很大,主要是内存消耗的多。而delete的速度,我们知道调节Hibernate的Batch Size可以提供大大提高insert, delete和update的速度。

我的测试:

Oracle817,ojdbc14.jar 表记录1万条,全部删除。

JDBC:

sql语句
delete from cat

速度:平均6s

Hibernate:

session.delete("from Cat as c");;


Batch Size = 0 速度: 25s
Batch Size = 50 速度: 6s

批量删除和批量更新建议用JDBC,这是一个原则,当然有的时候可能必须用Hibernate来批量更新和批量删除,那么这个时候我想说的就是,Hibernate批量更新和删除效率并非传说中的那么差,只要优化的好,速度也非常快。
   发表时间:2004-10-26  
正在考虑一个从JDBC移植到Hibernate的方案,
碰到批量修改的问题,翻到此贴,受益不少,不过仍然还有一些疑问:

对于update tbl set ... where...,Session接口里面只有2个相关的方法,好像无法象上诉方法实现:
void update(Object object)
void update(Object object, Serializable id) 

如果“批量删除和批量更新建议用JDBC,...”,是否以为着降低了程序可移植性呢?而我们移植到Hibernate的一个主要目的是为了支持不同的数据库。

是否这时候应该考虑把Spring用上?

先谢谢所有的答复。
0 请登录后投票
   发表时间:2004-10-26  
我的DB包里有个JDBCUtil类....专门负责删除和更新的...至于移植性问题...由于逻辑简单..用到的都是ANSI SQL,没有移植性问题..

唯一的担心,  并发访问时,  某个客户端通过JDBC对某个PO进行操作(del or upt)后,hibernate再操作会不会有严重的后果...目前尚未遇到这种问题
0 请登录后投票
   发表时间:2004-10-28  
我们的SQL基本上也是ANSI SQL,除了一些递归查询语句。

不过就算是ANSI SQL,用PreparedStatement的时候,有些setXXX也是不兼容啊,例如DB2 Integer --> Oracle NUMBER,一个是setInteger(), 一个是setBigDecimail(),不知道是否有遇到类似情况?
0 请登录后投票
   发表时间:2004-10-30  
楼上的问题其实还有另2个选择,第一使用setInt/setLong,第二使用setObject。
0 请登录后投票
   发表时间:2004-11-05  
swing 写道
楼上的问题其实还有另2个选择,第一使用setInt/setLong,第二使用setObject。

用setObject()到可以解决一些问题,但是要new 这个object 倒
也是有一样的问题啊。用DB2要new Integer(),用Oracle要new BigDecimal()?
0 请登录后投票
   发表时间:2004-11-09  
引用
Hibernate作为ORM,有一个ORM固有的问题,就是由于为了持久对象的同步,不能够使用批量删除和批量更新的sql,只能按照主键一条条来操作。



那这么说没有主键的表就不能通过session.update(object)来更新了吧??
是不是要直接写sql来更新?
0 请登录后投票
   发表时间:2007-04-19  
Hibernate 中提供了StatelessSession来专门进行批量处理,它不维护对象状态
0 请登录后投票
   发表时间:2007-04-19  
hantsy 写道
Hibernate 中提供了StatelessSession来专门进行批量处理,它不维护对象状态
三年前Hibernate的功能怎么能和现在比?
0 请登录后投票
   发表时间:2007-04-23  
其实的确可以考虑Hibernate3了.robbin大哥讲的是2.X,所以当时我的处理就是直接用SQL解决.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics