浏览 4047 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-14
我们争论的焦点有两个: 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的流量大增啊。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-06-14
如果要追求批量删除的性能,应该使用hibernate的batch功能,你可以试试看把session.delete(p.s delete方法已经被deprecated)改成:
session.createQuery("delete from DeleteTest dt where dt.tid > 1").executeUpdate(); 你会发现性能和jdbc是同一级别的 |
|
返回顶楼 | |
发表时间:2008-06-14
谢谢楼上的意见
|
|
返回顶楼 | |
发表时间:2008-06-14
racnow 写道 2)、仁兄说,batch size对delete操作会有很大的性能提升。 这个观点是错的,batch-size只对查询的batch fetching性能有提高,而对delete操作是没有用处的,你单次修改测试得出的时间差异不足以证明这个问题,你应该多跑几次,得出平均值。 这些问题在hibernate自己的文档上都有详细说明,现在网上大部分的中文hibernate资料都还停留在2.0版本,但是一些hibernate的最佳实践在2.0~3.x有很多改变,请不要被它们所误导。 |
|
返回顶楼 | |
发表时间:2008-06-14
嘿嘿,我也是反对这个观点的啊
|
|
返回顶楼 | |
发表时间:2008-06-14
删除数据jdbc肯定是最快的,hibernate最后还是要转换成jdbc来操作。
|
|
返回顶楼 | |
发表时间: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的知识。 |
|
返回顶楼 | |
发表时间: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说的吧,好了,到此为止吧。 |
|
返回顶楼 | |