bruce,List和Iterator都可以对JCS缓冲区填数据,但是只有Iterator才能从缓冲区取数据。Iterator慢就慢在结果集的遍历上,你只取前两条,看不出缓冲区的效果。
而且第1次运行Iterator的时候,JCS缓冲区里面没有数据的,需要填充,所以第1次不能利用JCS,从第2次,第3次开始,Iterator就开始从JCS缓冲区取数据了,给测试主程序加一个循环,第一次的测试结果相当于没有JCS的Iterator,后面的测试结果就是JCS的Iterator。
总结一把我的测试结果:

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速度最慢,不在一个数量级上,但是如果是大结果集取少量数据,速度却是最快的。

我上面贴的测试结果搞错了,刚才发现我上面的测试结果实际上是3000条记录的结果集取遍历1000条记录。重新做了一遍详细的测试。分别读取3000条记录和500条记录进行观察,统计测试结果。Hibernate Iterator JCS方式应该是最快的,Hibernate List速度和JDBC比较接近,而Hibernate Iterator速度还是慢的离谱。另外JDBC和List受到Fetch Size的影响很大,当Fetch Size大于50的时候,速度有非常显著的提升,而Hibernate Iterator的速度似乎不受Fetch Size的影响。

附件是我的测试结果,有兴趣的可以参考一下。

robbinak6TaFCfm1.xls

读取3000条记录的折线图:

读取500条记录的折线图:

我觉得应该把测试(testing)和评测(evaluating)分开看待,我们测试的目的只是想知道这种技术在当前环境中的可用性,是为了了解技术、选择技术的需要。

有的人把自己的test case拿出来给大家分享,我认为还是不错的,当然只能作为一家之言或者仅供参考。但是,至少它还是作了很多工作的。咱们缺少的就是“行”。

关于数据库速度这方面的测试,是不是应该考虑并发操作时的存取速度?

其实更需要测试的是复杂的表映射关系的操作的性能,当然多用户并发访问性能也很重要。但是那太复杂了,没有什么多投入很难测试的很准确。从上面的测试结果中,基本上对Hibernate的List和Iterator查询方式有了清楚的认识,这对我来说已经达到目的了。
对,复杂的表映射关系的操作和多用户并发访问主要考验数据库本身能力,与其它部分关系不算太大。

既然,用的是mysql数据库,那客户的要求就不会太苛刻。

/
从上面的测试结果中,基本上对Hibernate的List和Iterator查询方式有了清楚的认识,这对我来说已经达到目的了。
/
没错,从结果、工作原理两方面都加深了认识。

同意magician的说法,交流为主,不要伤了人家的感情,大家都是从不懂到懂的嘛
hibernate最为一个持久化对象的解决方案,除了具有JDBC的特性,还有很多值得注意的地方.例如:楼上提到的对象Cache.
hibernate的高级特性也不能忽视啊,例如:它可以为复杂的数据表进行映射,并且维护它们之间的关系.
总之,我觉得这样的争论是很有意义的.我也向大家学习哈

这里面有个点:Iterator是一次性取出来所有的主键,每次取对象的时候都是再访问数据库(不用jcs),而list是一次性全取出来。
第一次去数据,最好用list。
用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读连续数据的机率少了些。
如此而已,为什么慢,就这些地方了。

补充一点点,通常我们用sql都是带上where,上面为了简化,没有加where条件。where体现索引的价值