论坛首页 Java企业应用论坛

Hibernate的delete操作性能测试

浏览 4029 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-14  
   这两天和论坛里的老兄有关于Hibernate的delete操作性能的争论,最后是谁也不服谁,不欢而散,唯一比较统一的结论就是相信测试。

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

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


Hibernate删除:
	运行时间	Batch size
1	5786	0
2	5562	20
3	5360	50
4	5265	100


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

引用
仁兄的原话:
我也不知道用猪脑袋猜问题的人是从哪里猜出来Batch Size在数据库和应用在同一台机器上的情况下会没太大作用

针对仁兄的第二个观点而言,从运行结果上,确确实实设置了batch size后有一点性能提升,但是也实实在在的和我原先的观点一样,当应用和数据库是在同一机器上时并不能带来多少性能提升(虽然这个观点我也是从仁兄说的“圣经”里得出的)。


    仁兄说,我捧着夏昕的书当圣经,首先一点我要声明的是我不信基督教啊,所以圣经在我还比不上一堆草纸啊,确实,我对这些大家普遍接受的畅销书作者是比较信奉的,我确信能写出这种水平的书的人肯定是研究过源代码的,至少熟悉这个框架是怎么实现的。

另外每一样技术我都不只看一本书啊,有三四本书综合之后,相同的观点我觉得我可以信任,不同地方我们再探讨吗,看看谁的是对的,如果你这个信不着也那个信不过,那你还信不信Gavin king呢,不信的话你自己开发持久层好了啊,数据库也是别人的东西,你也不要用了,自己写一个,还有Java,还有Windows,还有你的显示器,cpu….,你回到原始社会自给自足好了吗。


   好了,火药味太重了,这个话题到此为止了。嘿嘿,这两天为了和你争,由于我频繁访问javaeye的流量大增啊。
   发表时间:2008-06-14  
如果要追求批量删除的性能,应该使用hibernate的batch功能,你可以试试看把session.delete(p.s delete方法已经被deprecated)改成:
session.createQuery("delete from DeleteTest dt where dt.tid > 1").executeUpdate();

你会发现性能和jdbc是同一级别的
0 请登录后投票
   发表时间:2008-06-14  
谢谢楼上的意见
0 请登录后投票
   发表时间:2008-06-14  
racnow 写道

2)、仁兄说,batch size对delete操作会有很大的性能提升。

这个观点是错的,batch-size只对查询的batch fetching性能有提高,而对delete操作是没有用处的,你单次修改测试得出的时间差异不足以证明这个问题,你应该多跑几次,得出平均值。

这些问题在hibernate自己的文档上都有详细说明,现在网上大部分的中文hibernate资料都还停留在2.0版本,但是一些hibernate的最佳实践在2.0~3.x有很多改变,请不要被它们所误导。
0 请登录后投票
   发表时间:2008-06-14  
嘿嘿,我也是反对这个观点的啊
0 请登录后投票
   发表时间:2008-06-14  
删除数据jdbc肯定是最快的,hibernate最后还是要转换成jdbc来操作。
0 请登录后投票
   发表时间:2008-06-14  
我还你点流量吧。
不知道为什么你总是执着于几年前的技术,我不是说得很明白吗,hibernate3的批量删除已经做了改进,只是执行一条delete语句,没有你总是提到的所谓全查询出来再一条条删除的情况,你的代码我看过了,session.delete("from DeleteTest as t where t.tid>1");这在hiberante3里是不提倡使用的,你说你做了测试,我相信你的测试数据。那么你看看我的测试同样是删除10000条数据,然后告诉你hibernate3在批量删除上是怎么操作的:
		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.person
484
484
485

jdbc:
203
219
250

sql2000
hibernate:
375
547
438

jdbc:
125
219
156

这样看来,hql与sql在批量删除上是存在着差别,可是比起你试测的时间差,可是在同一个数量级的哟。
还有就是说batch size,这点在hiberante3上没有什么效果,这句话是正确的,那是因为它根本就不需要,因为它只执行一条sql语句Hibernate: delete from sxy.person。
最近忙着办理毕业手续,可是为了让你知道,花了点时间去再测试,所以这个问题就到这吧,没什么时间,以后再来探讨吧。
看几本书不重要,重要的是不要看过时的技术。我是直接hibernate3上手的,所以对hibernate2还不太了解,可是因为与你探讨,学到了点hibernate2的知识。
0 请登录后投票
   发表时间: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说的吧,好了,到此为止吧。
0 请登录后投票
论坛首页 Java企业应用版

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