ddf168913
2009-10-10 16:32 阅读 348
已采纳

Hibernate批量删除问题

我使用这样的hql语句删除
[code="java"]
delete from User where id in(16.18)
[/code]

他发出的sql语句是:
[code="java"]
delete from t_user where id in (16 , 18)
[/code]

并没有发出查询16 18两个User对象,然后再删除这两个user对象

为什么说Hibernate批量删除效率低呢?那位解释解释
[b]问题补充:[/b]
[quote]
这个方式进行删除时,是不用对user对象进行查询了,所以效果跟JDBC一样快了,但是带来了个后果就是不能使用Hibernate的缓存了。在这里删除的数据,在缓存中是不能体现出来的,必须在后面进行主动的更新。
Java代码
session.flush();

[/quote]

session.flush(); 是将缓存数据与数据库数据同步

[quote]
这个操作带来的开销并不一定比查询出来再删除带来的开销要小的。

所以通常的删除方式是将要删除的对象找出来再进行删除。

[/quote]

“将要删除的对象找出来再进行删除。”
将事务提交时,hibernate也会执行session.flush啊

[b]问题补充:[/b]
[quote]你写HQL语句 当遇到解析不出的关键字时,Hibernate会直接把它翻译成普通的SQL语句进行操作的[/quote]

我写的HQL里面有解析不出的关键字吗?
谢谢

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • 已采纳
    CaiHuajiang CaiHuajiang 2009-10-11 11:58

    [code="java"]这个方式进行删除时,是不用对user对象进行查询了,所以效果跟JDBC一样快了,但是带来了个后果就是不能使用Hibernate的缓存了。在这里删除的数据,在缓存中是不能体现出来的,必须在后面进行主动的更新。
    Java代码
    session.flush(); [/code]
    这里是不是session.flush,是session.evict(entity);
    还是一句话,要么使用bulk update/delete方式,要么使用操作持久化对象方式,当使用bulk update时,不可避免导致一级缓存的脏读,Hibernate的解决方式仅仅是删除二级缓存。
    所以通常的方式就是直接操作持久化对象,这要不会引起数据库与缓存的不一致。

    [url]http://www.iteye.com/topic/21640[/url]

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 2009-10-10 16:40

    当然不是指写的hql语句的问题,而是它的api的问题

    看看http://www.iteye.com/topic/265
    http://www.iteye.com/problems/24892

    点赞 评论 复制链接分享
  • iteye_2240 iteye_2240 2009-10-10 17:00

    并非所有操作效率都低,而是指部分API操作。

    点赞 评论 复制链接分享
  • CaiHuajiang CaiHuajiang 2009-10-11 07:13

    [quote]
    [code="java"]delete from t_user where id in (16 , 18)

    delete from t_user where id in (16 , 18)[/code]
    并没有发出查询16 18两个User对象,然后再删除这两个user对象
    为什么说Hibernate批量删除效率低呢?那位解释解释 [/quote]

    这个方式进行删除时,是不用对user对象进行查询了,所以效果跟JDBC一样快了,但是带来了个后果就是不能使用Hibernate的缓存了。在这里删除的数据,在缓存中是不能体现出来的,必须在后面进行主动的更新。
    [code="java"]session.flush();[/code]
    这个操作带来的开销并不一定比查询出来再删除带来的开销要小的。

    所以通常的删除方式是将要删除的对象找出来再进行删除。
    [code="java"]为什么说Hibernate批量删除效率低呢?那位解释解释 [/code]
    找出来进行一个个删除,如果要删除10条记录,就要进行20条SQL语句,当然效率不如直接使用delete from table where x=x 来得快了。当然,Hibernate有其自己的处理方式,就是使用in,但是对于数据库来说,当in内部的个数不明确时,不建议使用in的,因为SQL语句在DB的语句池中是可重用的,而不同个数的in操作的语句是不可重用的,这带来查询效率的问题。
    再者,当数据量稍微过大时,使用in也不能达到多好的优化效果,如要删除1000条语句时,在in语句体内判断50个值,也得几百条SQL语句。
    所以,使用了Hibernate注定了不能非常优良地使用DB。其效率的根本还是在于缓存,当系统设置了合理的缓存时,才能带来性能的提高,否则,其任何查询语句都不可能比直接使用JDBC来得更快(尤其是HQL生成的查询语句,其效率总是有这样那样的问题,要是设置不合理的话,一个语句跑个几十秒非常正常,而在JDBC连接时,使用Hint,可以使得查询在不到1秒内完成)。

    点赞 评论 复制链接分享
  • xuhbiao NONE9 2009-10-11 09:51

    你写HQL语句 当遇到解析不出的关键字时,Hibernate会直接把它翻译成普通的SQL语句进行操作的。

    点赞 评论 复制链接分享

相关推荐