JDBC和hibernate

JDBC与Hibernate在性能上相比,JDBC灵活性有优点。而Hibernate在易学性,易用性上有些优点。当用到不少复杂的多表联查和复杂的数据库操做时,JDBC有优点。java

相同点:程序员

◆二者都是JAVA的数据库操做中间件。数据库

◆二者对于数据库进行直接操做的对象都不是线程安全的,都须要及时关闭。安全

◆二者均可以对数据库的更新操做进行显式的事务处理。性能

不一样点测试

◆使用的SQL语言不一样:JDBC使用的是基于关系型数据库的标准SQL语言,Hibernate使用的是HQL(Hibernate query language)语言优化

◆操做的对象不一样:JDBC操做的是数据,将数据经过SQL语句直接传送到数据库中执行,Hibernate操做的是持久化对象,由底层持久化对象的数据更新到数据库中。ui

◆数据状态不一样:JDBC操做的数据是“瞬时”的,变量的值没法与数据库中的值保持一致,而Hibernate操做的数据是可持久的,即持久化对象的数据属性的值是能够跟数据库中的值保持一致的。线程

JDBC与Hibernate读取性能中间件

一、JDBC仍然是最快的访问方式,不管是Create仍是Read操做,都是JDBC快。

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

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

四、读取数据,Hibernate的Iterator速度很是缓慢,由于他是每次next的时候才去数据库取数据,这一点从观察任务管理器的java进程占用内存的变化也能够看得很清楚,内存是几十K几十K的增长。

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

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

七、Hibernate的Iterator方式并不是一无可取,它适合于从大的结果集中选取少许的数据,即不须要占用不少内存,又能够迅速获得结果。另外Iterator适合于使用JCS缓冲。最终结论:

因为MySQL的JDBC驱动的重大缺陷,使得测试结果变得毫无心义,不具有任何参考价值,只是咱们可以大概判断出一些结论:

1、精心编写的JDBC不管如何都是最快的。

2、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


为了不形成误导,最后强调一下:

1、“精心编写”的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速度。

2、Hibernate List和Iterator方式的比较

JDBC与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的影响。

相关文章
相关标签/搜索