浏览 33074 次
锁定老帖子 主题:Hibernate的批量删除的效率分析
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-09-16
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批量更新和删除效率并非传说中的那么差,只要优化的好,速度也非常快。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-10-26
正在考虑一个从JDBC移植到Hibernate的方案,
碰到批量修改的问题,翻到此贴,受益不少,不过仍然还有一些疑问: 对于update tbl set ... where...,Session接口里面只有2个相关的方法,好像无法象上诉方法实现: void update(Object object) void update(Object object, Serializable id) 如果“批量删除和批量更新建议用JDBC,...”,是否以为着降低了程序可移植性呢?而我们移植到Hibernate的一个主要目的是为了支持不同的数据库。 是否这时候应该考虑把Spring用上? 先谢谢所有的答复。 |
|
返回顶楼 | |
发表时间:2004-10-26
我的DB包里有个JDBCUtil类....专门负责删除和更新的...至于移植性问题...由于逻辑简单..用到的都是ANSI SQL,没有移植性问题..
唯一的担心, 并发访问时, 某个客户端通过JDBC对某个PO进行操作(del or upt)后,hibernate再操作会不会有严重的后果...目前尚未遇到这种问题 |
|
返回顶楼 | |
发表时间:2004-10-28
我们的SQL基本上也是ANSI SQL,除了一些递归查询语句。
不过就算是ANSI SQL,用PreparedStatement的时候,有些setXXX也是不兼容啊,例如DB2 Integer --> Oracle NUMBER,一个是setInteger(), 一个是setBigDecimail(),不知道是否有遇到类似情况? |
|
返回顶楼 | |
发表时间:2004-10-30
楼上的问题其实还有另2个选择,第一使用setInt/setLong,第二使用setObject。
|
|
返回顶楼 | |
发表时间:2004-11-05
swing 写道 楼上的问题其实还有另2个选择,第一使用setInt/setLong,第二使用setObject。
用setObject()到可以解决一些问题,但是要new 这个object 倒 也是有一样的问题啊。用DB2要new Integer(),用Oracle要new BigDecimal()? |
|
返回顶楼 | |
发表时间:2004-11-09
引用 Hibernate作为ORM,有一个ORM固有的问题,就是由于为了持久对象的同步,不能够使用批量删除和批量更新的sql,只能按照主键一条条来操作。
那这么说没有主键的表就不能通过session.update(object)来更新了吧?? 是不是要直接写sql来更新? |
|
返回顶楼 | |
发表时间:2007-04-19
Hibernate 中提供了StatelessSession来专门进行批量处理,它不维护对象状态
|
|
返回顶楼 | |
发表时间:2007-04-19
hantsy 写道 Hibernate 中提供了StatelessSession来专门进行批量处理,它不维护对象状态 三年前Hibernate的功能怎么能和现在比?
|
|
返回顶楼 | |
发表时间:2007-04-23
其实的确可以考虑Hibernate3了.robbin大哥讲的是2.X,所以当时我的处理就是直接用SQL解决.
|
|
返回顶楼 | |