Oracle:
Hibernate Iterator JCS(速度最快) < JDBC < Hibernate List < Hibernate Iterator
不同的Fetch Size会影响速度,不过上述排名不变。JCS的速度最快的时候是JBDC两倍,JDBC速度在Hibernate List速度的两倍和三倍之间。Hibernate Iterator速度最慢,不在一个数量级上。
MySQL :
JDBC < Hibernate Iterator JCS < Hibernate List < Hibernate Iterator
Fetch Size没有用处。Hibernate Iterator JCS虽然比JDBC慢一些,但是慢的不多。JDBC速度是Hibernate List速度两倍,Hibernate Iterator速度最慢,不在一个数量级上,但是如果是大结果集取少量数据,速度却是最快的。
附件是我的测试结果,有兴趣的可以参考一下。


有的人把自己的test case拿出来给大家分享,我认为还是不错的,当然只能作为一家之言或者仅供参考。但是,至少它还是作了很多工作的。咱们缺少的就是“行”。
关于数据库速度这方面的测试,是不是应该考虑并发操作时的存取速度?
既然,用的是mysql数据库,那客户的要求就不会太苛刻。
/
从上面的测试结果中,基本上对Hibernate的List和Iterator查询方式有了清楚的认识,这对我来说已经达到目的了。
/
没错,从结果、工作原理两方面都加深了认识。
hibernate的高级特性也不能忽视啊,例如:它可以为复杂的数据表进行映射,并且维护它们之间的关系.
总之,我觉得这样的争论是很有意义的.我也向大家学习哈
用Iterator来取数据,最好是在jcs填上之后,他是一次性取出主键,再根据主键找数据,如果jcs不是空的,他先匹配jcs对象。所以,jcs空的情况下如果你去数据的话,用Iterator是n+1次访问数据库,数据量一大,浪费的时间就明显了
hibernate主要是将关系数据库变成面像对像的方式,目的在于开发维护代码的方便性。但在他身上,有些题外的东西却被我们关注得太多,浪费了很多。
像这种性能之类的问题,不只出现在这里,ejb,struts都有问过的贴子
为什么会,基础不牢!
如果,你知道读内存要多少时间,读硬盘数据要多少时间,读连续字节和单个字节时间差多少,知道硬盘的IO是一个还是多个等等,这些看似简单但又基础性的东西,又怎么为这些问题思来想去呢,还做那么多测试。浪费时间而已。
list整体读,iterate先查key再读。在DB分解:
jdbc:
sql传至db(select * from table)-->sql解析-->查索引区-->查表-->找到数据-->数据返回
list:
hibernate将list动作解析成sql(select * from table)-->sql传至db-->sql解析-->查索引区-->查表-->找到数据-->数据返回-->hibernate将数据构造成list
iterate:
hibernate将list动作解析成sql(select key from table)-->sql传至db-->sql解析-->查索引区-->数据返回-->hibernate将数据构造成iterate
对每一次next方法有,hibernate将list动作解析成sql(select * from table where key ..)-->sql解析(只有第一次解析)-->查索引区-->数据返回-->hibernate将数据构造成object
list比jdbc多了什么
一条,hibernate将list动作解析成sql(select * from table)
iterate比jdbc多了什么
多了一次sql解析,多了几次sql传输及数据传输的动作,DB的数据查询上,可以利用IO读连续数据的机率少了些。
如此而已,为什么慢,就这些地方了。