`
YiSingQ
  • 浏览: 88160 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate JDBC读取性能比较

阅读更多
1、JDBC仍然是最快的访问方式,不论是Create还是Read操作,都是JDBC快。

2、Hibernate使用uuid.hex构造主键,性能稍微有点损失,但是不大。

3、Create操作,JDBC在使用批处理的方式下速度比Hibernate快,使用批处理方式耗用JVM内存比不使用批处理方式要多得多。

4、读取数据,Hibernate的Iterator速度非常缓慢,因为他是每次next的时候才去数据库取数据,这一点从观察任务管理器的java进程占用内存的变化也可以看得很清楚,内存是几十K几十K的增加。

5、读取数据,Hibernate的List速度很快,因为他是一次性把数据取完,这一点从观察任务管理器的java进程占用内存的变化也可以看得很清楚,内存几乎是10M的10M的增加。

6、JDBC读取数据的方式和Hibernate的List方式是一样的(这跟JDBC驱动有很大关系,不同的JDBC驱动,结果会很不一样),这从观察java进程内存变化可以判断出来,由于JDBC不需要像Hibernate那样构造一堆Cat对象实例,所以占用JVM内存要比Hibernate的List方式大概少一半左右。

7、Hibernate的Iterator方式并非一无是处,它适合于从大的结果集中选取少量的数据,即不需要占用很多内存,又可以迅速得到结果。另外Iterator适合于使用JCS缓冲。
最终结论:
由于MySQL的JDBC驱动的重大缺陷,使得测试结果变得毫无意义,不具备任何参考价值,只是我们能够大概判断出一些结论:
一、精心编写的JDBC无论如何都是最快的。
二、Hibernate List和Iterator适用的场合不同,不存在孰优孰劣的问题

我个人认为Hibernate Iterator是JDBC Result的封装,Hibernate List是Scrollable Result的封装,所以我推测,如果在Oracle或者DB2上面做同样的Read测试,如果结果集小于FetchSize,4者在速度上应该都不会有差别;如果结果集大于FetchSize的话,但是不是FetchSize的很多倍,速度排名应该是:
JDBC Scrollable Result (消耗时间最少) < Hibernate List < JDBC Result < Hibernate Iterator

如果结果集非常大,但是只取结果集中的部分记录,那么速度排名:
JDBC Result < Hibernate Iterator < JDBC Scrollable Result < Hibernate List




为了避免造成误导,我最后强调一下我的结论:

一、“精心编写”的JDBC一定是性能最好的

实际上,不管CMP,Hibernate,JDO等等,所有的ORM都是对JDBC的封装,CMP则是一个重量级封装,JDO中度封装,Hibernate是轻量级的封装。从理论上来说,ORM永远也不可能比JDBC性能好。就像任何高级语言的运行性能永远也不会好过汇编语言一个道理。

对于Create和Update操作来说,由于普通的Java程序员未必会使用JDBC的Batch的功能,所以Hibernate会表现出超过JDBC的运行速度。

对于Read的操作来说,ORM普遍都会带有双层缓冲,即PrepreadStatement缓冲和ResultSet缓冲,而JDBC本身没有缓冲机制,在使用连接池的情况下,一些连接池将会提供PrepreadStatement缓冲,有的甚至提供ResultSet缓冲,但是普遍情况下,Java程序员一般都不会考虑到在写JDBC的时候优化缓冲,而且这样做也不太现实,所以在某些情况下,ORM会表现出超过JDBC的Read速度。


二、Hibernate List和Iterator方式的比较

这是我在测试中想要重点考察的方面,但是由于JDBC驱动问题,结果变的很不可信,不过仍然可以得到一些有用的结论。

Read操作包括两步:第一步是把数据库的数据取出,构造结果集,把数据放入到结果集中;第二步是遍历结果集,取每行数据。

List方式是1次性把所有的数据全部取到内存中,构造一个超大的结果集,主要的时间开销是这一步,这一步的时间开销要远远超过JDBC和Iterator方式下构造结果集的时间开销,并且内存开销也很惊人;而对结果集的遍历操作,速度则是非常的惊人(从上面的测试结果来看,30万记录的内存遍历不到100ms,由于这一步不受JDBC影响,因此结果可信)。因此,List方式适合于对结果集进行反复多次操作的情况,例如分页显示,往后往前遍历,跳到第一行,跳到最后一行等等。

Iterator方式只取记录id到内存中,并没有把所有数据取到内存中,因此构造结果集的时间开销很小,比JDBC和List方式都要少,并且内存开销也小很多。而对结果集的遍历的操作的时候,Iterator仍然要访问数据库,所有主要的时间开销都花在这里。因此,Iterator方式适合于只对结果集进行1次遍历操作的情况,并且Iterator方式特别适合于从超大结果集中取少量数据,这种情况Iterator性能非常好。另外Iterator方式可以利用JCS缓冲,在使用缓冲的情况下Iterator方式的遍历操作速度将不受数据库访问速度的影响,得到彻底的提升。
Hibernate Iterator JCS方式应该是最快的,Hibernate List速度和JDBC比较接近,而Hibernate Iterator速度还是慢的离谱。另外JDBC和List受到Fetch Size的影响很大,当Fetch Size大于50的时候,速度有非常显著的提升,而Hibernate Iterator的速度似乎不受Fetch Size的影响。
分享到:
评论

相关推荐

    JDBC与Hibernate的比较

    - **读取速度**:Hibernate的读取性能通常优于JDBC,特别是在使用迭代器时。Hibernate的`Iterator`可以在每次请求下一条记录时才从数据库中获取数据,减少了内存占用,但在实际应用中需要根据具体情况选择合适的策略...

    Hibernate and JDBC

    ### Hibernate与JDBC:概述与对比 #### 一、JDBC简介 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,它可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC...

    jdbc和hibernate的区别

    **性能比较:** 1. **创建操作**:JDBC在使用批处理的情况下速度较快,但会消耗更多内存。 2. **读取操作**:JDBC的读取速度通常更快,尤其是使用批处理时。Hibernate的`List`方法一次性加载所有数据,适合小数据量...

    hibernate所需包:hibernate3,依赖包,JDBC

    3. **Configuration**: 负责读取Hibernate配置文件(hibernate.cfg.xml),创建SessionFactory实例。 4. **Criteria API**: 提供了一种更面向对象的方式来查询数据库,比传统的HQL(Hibernate Query Language)更加...

    jdbc_Hibernate总结

    Hibernate是一个流行的ORM(Object-Relational Mapping)框架,它为开发者提供了对JDBC的轻量级封装,简化了数据库操作。使用Hibernate,开发者可以更专注于业务逻辑,而不是底层的SQL语法。在搭建Hibernate项目时,...

    Jdbc 和hibernate

    4. **Hibernate与JDBC比较**: - Hibernate抽象了数据库层,使代码更简洁,降低了维护成本。 - Hibernate提高了开发效率,减少了SQL编写工作。 - Hibernate的查询优化可能不如直接手写的SQL,但在大部分场景下...

    类似hibernate的jdbc封装

    8. **缓存机制**:类似Hibernate的一级缓存和二级缓存,提高读取速度,减轻数据库压力。 通过这样的封装,开发人员可以更专注于业务逻辑,而不用关心底层数据库交互的细节。虽然这不完全等同于Hibernate的全部功能...

    使用hibernate对oracle读取blob

    本文将详细介绍如何使用Hibernate和JDBC读取和存储Oracle数据库中的Blob对象。 ### 1. Hibernate Blob操作 在Hibernate中,Blob对象通常与Java的`java.sql.Blob`接口相对应。在实体类中,你可以定义一个Blob类型的...

    hibernate和jdbc测试

    对于性能测试,可以比较使用JDBC和Hibernate执行相同任务的时间消耗,评估哪种方式更高效。同时,要关注内存使用情况,因为ORM框架可能会增加内存开销。 在进行测试时,使用单元测试框架,如JUnit,可以帮助自动化...

    hibernate+junit+mysql-jdbc开发核心jar包三合一

    本资源“hibernate+junit+mysql-jdbc开发核心jar包三合一”显然是为了支持SSH框架中的Hibernate部分,并结合JUnit进行测试以及MySQL数据库连接。现在我们将详细探讨这三个组件及其在Java开发中的应用。 **Hibernate...

    springmvc_hibernate_ibatis_jdbc

    标题中的"springmvc_hibernate_ibatis_jdbc"指的是一个整合了SpringMVC、Hibernate、iBatis和JDBC这四种关键技术的Java应用框架。这个框架旨在提供一个全面且强大的解决方案,便于开发人员进行Web应用程序的构建。 ...

    Hibernate性能优化研究.pdf

    - **使用二级缓存**:Hibernate的二级缓存可以显著减少对数据库的访问次数,提高读取性能。通过合理配置缓存策略,可以在不影响数据一致性的前提下提高系统性能。 - **连接池管理**:使用连接池可以复用数据库连接,...

    JDBC和hibernate事务的详解

    Hibernate事务与JDBC事务的比较 - **易用性**:Hibernate通过面向对象的方式管理事务,相比JDBC的SQL操作,更易于理解和实现。 - **效率**:JDBC直接操作数据库,通常比Hibernate的ORM操作更快,但在事务管理上...

    JDBC+Hibernate将Blob数据写入Oracle

    在Oracle数据库中,BLOB类型的字段具有特殊的处理方式,尤其在使用JDBC(Java Database Connectivity)和Hibernate框架时,需要特别注意其写入过程。以下是对“JDBC+Hibernate将Blob数据写入Oracle”这一主题的深入...

    Jdom生成hibernate.cfg.xml和读取其中内容

    标题中的“Jdom生成hibernate.cfg.xml和读取其中内容”涉及到两个主要知识点:一是JDOM库在Java中解析和生成XML文档的应用,二是利用JDOM操作Hibernate配置文件`hibernate.cfg.xml`。 首先,JDOM是Java Document ...

    Hibernate+JDBC实现批量插入、更新及删除的方法详解

    * 设置批量尺寸:通过设置hibernate.jdbc.batch_size参数,可以控制批量插入的大小,从而减少数据库的读取次数,提高速度。 * 关闭二级缓存:可以通过关闭二级缓存来避免Hibernate维护二级缓存时的性能损失。 * 清空...

    hibernate-junit4.0-postgresql-8.4-jdbc等jar包

    3. **编写DAO层**:Data Access Object层是数据库操作的接口,使用Hibernate的Session接口来进行CRUD(创建、读取、更新、删除)操作。 4. **使用JUnit测试**:编写JUnit测试用例来验证你的DAO层和业务逻辑是否正确...

    使用JDBC和Hibernate来写入Blob型数据到Oracle中

    要将Blob型数据写入Oracle数据库,我们可以使用两种常见的技术:JDBC(Java Database Connectivity)和Hibernate。JDBC是Java与数据库交互的标准API,而Hibernate则是一个ORM(Object-Relational Mapping)框架,...

Global site tag (gtag.js) - Google Analytics