`
racnow
  • 浏览: 14304 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate的delete操作性能测试

阅读更多
   这两天和论坛里的老兄有关于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的流量大增啊。
分享到:
评论
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说的吧,好了,到此为止吧。
6 楼 gjs622520 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的知识。
5 楼 wolfbrood 2008-06-14  
删除数据jdbc肯定是最快的,hibernate最后还是要转换成jdbc来操作。
4 楼 racnow 2008-06-14  
嘿嘿,我也是反对这个观点的啊
3 楼 QuakeWang 2008-06-14  
racnow 写道

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

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

这些问题在hibernate自己的文档上都有详细说明,现在网上大部分的中文hibernate资料都还停留在2.0版本,但是一些hibernate的最佳实践在2.0~3.x有很多改变,请不要被它们所误导。
2 楼 racnow 2008-06-14  
谢谢楼上的意见
1 楼 QuakeWang 2008-06-14  
如果要追求批量删除的性能,应该使用hibernate的batch功能,你可以试试看把session.delete(p.s delete方法已经被deprecated)改成:
session.createQuery("delete from DeleteTest dt where dt.tid > 1").executeUpdate();

你会发现性能和jdbc是同一级别的

相关推荐

    Hibernate数据库操作实例.zip

    10. **性能优化**:探讨缓存策略、批处理更新、预加载等提高Hibernate性能的方法。 这个压缩包中的实例可能会涵盖以上所有或部分知识点,通过运行和分析这些实例,开发者可以深入理解Hibernate的工作原理,并提升在...

    hibernate 简单测试

    总结来说,"hibernate 简单测试"涵盖了Hibernate的基本使用和proxool连接池的集成,通过这个测试,开发者可以了解如何在实际项目中应用Hibernate进行数据库操作,以及如何优化数据库连接管理。理解并熟练掌握这些...

    spring4+hibernate4实现增删改查

    8. **测试**:编写TestSH4类进行测试,通过JUnit或其他测试框架,调用Service层的方法进行增删改查操作,验证功能是否正常。 以上就是使用Spring4和Hibernate4实现增删改查的基本流程。在实际开发中,我们还需要...

    hibernate和MySQL的jar

    6. **持久化操作**: 使用Hibernate进行CRUD(创建、读取、更新、删除)操作时,我们可以通过`save()`、`get()`、`update()`、`delete()`等方法,以及`Criteria`、`HQL`(Hibernate查询语言)或JPQL(Java ...

    hibernate操纵实体对象

    综上所述,`hibernateOperate.java`, `DeleteTest.java`, `HibernateSessionFactory.java`以及`BatchUpdateTest.java`这四个文件涵盖了Hibernate中的核心操作和测试场景,它们一起构成了一个完整的数据库操作示例,...

    使用springmvc+hibernate完成增删改查

    3. 实现DAO接口:使用Hibernate的Session接口进行数据操作,如save()、get()、update()、delete()等方法。 4. 创建Service层:业务逻辑处理,调用DAO实现具体功能。 5. 编写Controller:接收HTTP请求,调用Service...

    hibernate 重点知识原创

    在开始使用 Hibernate 之前,需要进行环境配置,主要包括导入 Hibernate 相关的 JAR 包,如 Hibernate 的核心库、JDBC 驱动和单元测试库。配置文件 `hibernate.cfg.xml` 是 Hibernate 的心脏,它包含了数据库连接...

    基于hibernate的baseDao

    例如,可以使用Spring的`@Transactional`注解进行事务管理,使用Hibernate的二级缓存提高性能,或者通过`Session.flush()`和`Session.clear()`方法控制session的状态。 6. **集成测试** 在实际项目中,BaseDAO应...

    HibernateDAO的写法

    HibernateDAO(Data Access Object)主要负责数据库的读写操作,它封装了对Hibernate Session的操作,降低了业务层与数据库的直接交互,提高了代码的可维护性和可测试性。DAO设计模式是将数据库操作隔离出来,使得...

    Hibernate Recipes

    6. **集成测试**:提供针对Hibernate应用进行单元测试和集成测试的最佳实践。 7. **扩展Hibernate**:探索如何利用拦截器、事件监听器等功能扩展Hibernate的功能。 #### 四、关键知识点详解 1. **配置Hibernate*...

    hibernate3.3 java project

    本项目是基于Hibernate 3.3版本的一个Java项目,专注于实现数据库的CRUD(Create, Read, Update, Delete)操作。对于那些初次接触Hibernate框架或者正在学习Java持久化技术的人来说,这是一个非常实用的学习资源。...

    hibernate课件

    在IBMHibernateAndSpring.ppt中,可能讲解了如何将Hibernate集成到Spring框架中,利用Spring的依赖注入和事务管理能力,使应用更加健壮和易于测试。 通过学习这些内容,你可以掌握Hibernate的基本使用,并能够将其...

    sqlserver的hibernate

    在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是底层的SQL语句。本教程将介绍如何使用Hibernate操作SQLServer数据库,提供一个易入门的...

    Hibernate(session管理)

    8. **脏检查和自动提交**:Hibernate会定期进行脏检查,检测对象的状态变化,并在事务提交时自动更新数据库。这意味着,只要在事务范围内对对象进行修改,无需显式调用update()方法,Hibernate也会自动处理。 9. **...

    hibernate 2 安装手记.rar

    编写JUnit测试用例,验证Hibernate操作数据库的正确性。确保所有操作都能成功执行且数据库状态符合预期。 通过以上步骤,您已完成Hibernate 2的安装和基本配置。接下来,您可以继续深入学习Hibernate的高级特性,...

    struts_hibernate整合

    5. **使用Hibernate进行CRUD操作**:在Action类的业务方法中,使用Session的save()、get()、update()、delete()等方法进行增删改查操作。 6. **添加拦截器**:Struts2允许我们自定义拦截器,例如事务管理拦截器,...

    Delphi 中的Hibernate

    5. **操作数据库**:使用Session的`save()`, `update()`, `delete()` 和 `get()` 方法进行数据操作。查询可以使用HQL(Hibernate查询语言)或者Criteria API,它们提供了一种面向对象的方式来编写查询,避免直接写...

    hibernate连接Access应用项目例子

    在本项目中,“hibernate连接Access应用项目例子”展示了如何使用Hibernate ORM框架与Microsoft Access数据库进行集成,实现数据的增、删、改、查(CRUD)操作。Hibernate是Java开发中的一个流行ORM(对象关系映射)...

    hibernate3.2之helloword

    8. **性能优化**:如何调整Hibernate配置以优化性能,如批处理操作、延迟加载等。 以上就是"hibernate3.2之HelloWorld"可能涉及的主要内容,这个教程对于初学者理解Hibernate框架及其在实际开发中的应用至关重要。...

Global site tag (gtag.js) - Google Analytics