这两天和论坛里的老兄有关于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的流量大增啊。
分享到:
相关推荐
10. **性能优化**:探讨缓存策略、批处理更新、预加载等提高Hibernate性能的方法。 这个压缩包中的实例可能会涵盖以上所有或部分知识点,通过运行和分析这些实例,开发者可以深入理解Hibernate的工作原理,并提升在...
总结来说,"hibernate 简单测试"涵盖了Hibernate的基本使用和proxool连接池的集成,通过这个测试,开发者可以了解如何在实际项目中应用Hibernate进行数据库操作,以及如何优化数据库连接管理。理解并熟练掌握这些...
8. **测试**:编写TestSH4类进行测试,通过JUnit或其他测试框架,调用Service层的方法进行增删改查操作,验证功能是否正常。 以上就是使用Spring4和Hibernate4实现增删改查的基本流程。在实际开发中,我们还需要...
6. **持久化操作**: 使用Hibernate进行CRUD(创建、读取、更新、删除)操作时,我们可以通过`save()`、`get()`、`update()`、`delete()`等方法,以及`Criteria`、`HQL`(Hibernate查询语言)或JPQL(Java ...
综上所述,`hibernateOperate.java`, `DeleteTest.java`, `HibernateSessionFactory.java`以及`BatchUpdateTest.java`这四个文件涵盖了Hibernate中的核心操作和测试场景,它们一起构成了一个完整的数据库操作示例,...
3. 实现DAO接口:使用Hibernate的Session接口进行数据操作,如save()、get()、update()、delete()等方法。 4. 创建Service层:业务逻辑处理,调用DAO实现具体功能。 5. 编写Controller:接收HTTP请求,调用Service...
在开始使用 Hibernate 之前,需要进行环境配置,主要包括导入 Hibernate 相关的 JAR 包,如 Hibernate 的核心库、JDBC 驱动和单元测试库。配置文件 `hibernate.cfg.xml` 是 Hibernate 的心脏,它包含了数据库连接...
例如,可以使用Spring的`@Transactional`注解进行事务管理,使用Hibernate的二级缓存提高性能,或者通过`Session.flush()`和`Session.clear()`方法控制session的状态。 6. **集成测试** 在实际项目中,BaseDAO应...
HibernateDAO(Data Access Object)主要负责数据库的读写操作,它封装了对Hibernate Session的操作,降低了业务层与数据库的直接交互,提高了代码的可维护性和可测试性。DAO设计模式是将数据库操作隔离出来,使得...
6. **集成测试**:提供针对Hibernate应用进行单元测试和集成测试的最佳实践。 7. **扩展Hibernate**:探索如何利用拦截器、事件监听器等功能扩展Hibernate的功能。 #### 四、关键知识点详解 1. **配置Hibernate*...
本项目是基于Hibernate 3.3版本的一个Java项目,专注于实现数据库的CRUD(Create, Read, Update, Delete)操作。对于那些初次接触Hibernate框架或者正在学习Java持久化技术的人来说,这是一个非常实用的学习资源。...
在IBMHibernateAndSpring.ppt中,可能讲解了如何将Hibernate集成到Spring框架中,利用Spring的依赖注入和事务管理能力,使应用更加健壮和易于测试。 通过学习这些内容,你可以掌握Hibernate的基本使用,并能够将其...
在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以更专注于业务逻辑而不是底层的SQL语句。本教程将介绍如何使用Hibernate操作SQLServer数据库,提供一个易入门的...
8. **脏检查和自动提交**:Hibernate会定期进行脏检查,检测对象的状态变化,并在事务提交时自动更新数据库。这意味着,只要在事务范围内对对象进行修改,无需显式调用update()方法,Hibernate也会自动处理。 9. **...
编写JUnit测试用例,验证Hibernate操作数据库的正确性。确保所有操作都能成功执行且数据库状态符合预期。 通过以上步骤,您已完成Hibernate 2的安装和基本配置。接下来,您可以继续深入学习Hibernate的高级特性,...
5. **使用Hibernate进行CRUD操作**:在Action类的业务方法中,使用Session的save()、get()、update()、delete()等方法进行增删改查操作。 6. **添加拦截器**:Struts2允许我们自定义拦截器,例如事务管理拦截器,...
5. **操作数据库**:使用Session的`save()`, `update()`, `delete()` 和 `get()` 方法进行数据操作。查询可以使用HQL(Hibernate查询语言)或者Criteria API,它们提供了一种面向对象的方式来编写查询,避免直接写...
在本项目中,“hibernate连接Access应用项目例子”展示了如何使用Hibernate ORM框架与Microsoft Access数据库进行集成,实现数据的增、删、改、查(CRUD)操作。Hibernate是Java开发中的一个流行ORM(对象关系映射)...
8. **性能优化**:如何调整Hibernate配置以优化性能,如批处理操作、延迟加载等。 以上就是"hibernate3.2之HelloWorld"可能涉及的主要内容,这个教程对于初学者理解Hibernate框架及其在实际开发中的应用至关重要。...