(转http://blog.csdn.net/jxspace/article/details/1234002)
(关于hibernate性能的测试)
测试结果分析:
1. 在同等测试环境和条件下,hibernate优于jdbc这种说法是错误的,从测试结果来看, jdbc要优于hibernate,这从理论上是可以理解的,hibernate的基础就是jdbc,它不可能优于jdbc。
2. 影响数据库操作性能的因素很多,主要包括:
1)数据库自身
如mysql表类型,是ISAM还是innodb
2)数据库驱动
从测试数据和结果看,mysql的3.0.11版本的驱动显然更适合于mysql4.1.9版本的数据库,而高版本的3.1.11用于hibernate的插入操作则会丧失近3.5倍的执行效率,另外,经过笔者测试,在3.1.11版本的驱动中,使用与不使用批次(batch)插入操作居然没有任何区别,这也能解释一些技术论坛上提到的hibernate批处理操作有时候会实效这个令人困惑的问题。
3)操作数据库的程序本身
测试环境3表明,当mysql的表类型为innodb时,即使是采用JDBC直接写的方式,不采用事务方式插入记录,写入速率几乎是“蜗速”(~50条/秒),这可以说是“杀手级”的因素了。
结论:
<!--[if !supportLists]-->1. 笔者估计在大数据量写入状况下,Hibernate的性能损失在30%-35%左右<!--[endif]-->
<!--[if !supportLists]-->2. 对于要获取高性能数据读写的系统,不推荐使用Hibernate的ORM方式进行数据读写。<!--[endif]-->
<!--[if !supportLists]-->3. 性能的优劣除了所采用的技术决定外,更取决于使用技术的人,比如在测试环境三中,不采用事务方式写数据,其速度简直不能以“暴差”来形容,想想这样一种情况,让你去开一辆法拉利F1赛车,你一定能想象得到你驾驶的速度。:)<!--[endif]-->
后记:
在进行测试的时候,起初笔者使用的JDBC驱动是J/Conncector 3.1.11版本,发现Hibernate的批量写设置根本不起作用,是否使用批量写根本就没有差别,在一些网站上面也发现有类似的疑问,经过更换为3.0.x版本驱动后,批量写才生效,而且无论是Hibernate方式还是JDBC方式下,写记录的性能明显提升,表明3.0.X的驱动更适合于MySql4.1,为什么高版本的3.1.11反而在低版本数据库上面表现出低效?笔者在安装Roller这个Apache孵化器blog项目的时候,也对安装指导中推荐使用3.0.X版本来匹配MySql4.1数据库这个问题比较疑惑,可惜Roller的InstallGuid没有做具体解释,感兴趣的网友可以到Roller网站的wiki上去弄清楚这个问题,并把答案做个回复,非常感谢。这个插曲还说明了一个道理——“升级并非总是好事”。
25楼评论极为精彩:
25楼 fzpzy123 2010-05-31 00:27发表[回复] [引用] [举报] 其实第三个测试的结论,源于楼主对MySql的INNODB,乃至对所有事务型数据库系统执行语句的原理的误解。对于MySql INNODB、Sql Server等数据库而言,每单独执行一个SQL语句,都是一个事务。为什么每秒只剩下50条记录了?因为,在INNODB存储下,每执行一次INSERT操作,都要经历BEGIN Transaction、INSERT、COMMIT Transaction操作,也就是,第三种测试案例,实际上是提交了1000个事务。这个不用hibernate,而直接在mysql、sql server等数据库中,用
begin trans
insert 1000 times
commit
以及
insert 1000 times
执行,观察其消耗时间就知道了。注意后者的insert语句外部没有带事务。
这是数据库本身机制决定的,和hibernate还是用JDBC没有关系。同时也解释了为什么myisam下,单独执行1000个insert语句,不用事务也很快的原因,因为它根本不用事务。