读书人

Hibernate的delete可操作性能测试

发布时间: 2012-11-20 09:55:43 作者: rapoo

Hibernate的delete操作性能测试
这两天和论坛里的老兄有关于Hibernate的delete操作性能的争论,最后是谁也不服谁,不欢而散,唯一比较统一的结论就是相信测试。

我们争论的焦点有两个:
1)、仁兄说,原则上批量delete是用JDBC,但是现在的Hibernate在这方面做的也不错,可以直接用
2)、仁兄说,batch size对delete操作会有很大的性能提升。

今天有一点点时间,我尝试性的做了一下简单测试。当然并不具有多少科学性,我只想证明我的观点是对的。
JDBC删除:

时间 1196217231874189


Hibernate删除:
运行时间Batch size1578602556220353605045265100


针对仁兄的第一个观点而言,确实如果我们所作的系统如果要求不是太高的话,这个时间我们是可以接受的,毕竟不是太长吗,但是还是不在同一个“数量级”上的(牛人用过的词汇,据说怕我听不懂)。但是你有没有发现Hibernate是怎么样来优化删除操作的呢?做删除的时候它只是查找出所有的要删除的记录的id,然后把这些id扔给cache,我们的delete就算完成啦,剩下删除每一个id对应的记录交给cache来做,当然cache的作用本来就是匹配吗,这种优化确实有些高明,我们需要等的时间是少了,但是性能实实在在的没有多少提升,我们还是要运行10000行sql语句,所以我还是坚持我的观点,用Hibernate删除是没有选择的情况下才做的,用JDBC删除也有一点的缺点,我们需要一个更好的解决方案,等待牛人的出现。

session.createQuery("delete from DeleteTest dt where dt.tid > 1").executeUpdate();
你会发现性能和jdbc是同一级别的
Session session=HibernateUtils.getSession();String hql="delete Person";Transaction tx = session.beginTransaction();long time=System.currentTimeMillis();session.createQuery(hql).executeUpdate();System.out.println(System.currentTimeMillis()-time);tx.commit();session.close();
mysql
hibernate:
Hibernate: delete from sxy.person484484485

jdbc:
203219250

sql2000
hibernate:
375547438

jdbc:
125219156

这样看来,hql与sql在批量删除上是存在着差别,可是比起你试测的时间差,可是在同一个数量级的哟。
还有就是说batch size,这点在hiberante3上没有什么效果,这句话是正确的,那是因为它根本就不需要,因为它只执行一条sql语句Hibernate: delete from sxy.person。
最近忙着办理毕业手续,可是为了让你知道,花了点时间去再测试,所以这个问题就到这吧,没什么时间,以后再来探讨吧。
看几本书不重要,重要的是不要看过时的技术。我是直接hibernate3上手的,所以对hibernate2还不太了解,可是因为与你探讨,学到了点hibernate2的知识。 7 楼 racnow 2008-06-14 引用还有就是说batch size,这点在hiberante3上没有什么效果,这句话是正确的,那是因为它根本就不需要,因为它只执行一条sql语句Hibernate: delete from sxy.person。


不知道谁说设了batch size会有很大的性能提升的,
引用我也不知道用猪脑袋猜问题的人是从哪里猜出来Batch Size在数据库和应用在同一台机器上的情况下会没太大作用。
Oracle的话,Batch Size=0,delete一万条平均花25s,Batch Size=50,delete一万条平均花6s,如果用sql语句的话,平均6s

这些好像都是你说的,你应该不会说下面这段话你是基于Hibernate 2.x说的吧,好了,到此为止吧。

读书人网 >软件架构设计

热点推荐