9 月 17 日 在CSDN社区的Java技术栏中看到了网友lifejoy的一个贴子,题为“hibernate 写入性能暴差,如何配置?”,详细链接请见
http://community.csdn.net/Expert/TopicView3.asp?id=5025307
lifejoy网友写了段测试程序,用Hibernate作为持久手段测试了大数据量写入MySql数据库的性能。程序主要使用了一个循环嵌套,最里层循环为批量插入记录的代码,每一批插1000条记录,最外层循环为批次的控制,一共循环100批次,这样总的数据写入量为1000x100共十万记录。从lifejoy的测试数据看,用JDBC直接写的速率是600-800条/秒,而用Hibernate写的速率会从一开始的300多条降至几十条每秒,这个差距非常之大,难怪lifejoy使用了“暴差”这一非常使人触目惊心的语言。
Hibernate的写入性能到底如何?真的到了“暴差”这样的地步么?其性能与JDBC直写相比,到底差距多大?这些个问题,通过google结果,众说纷纭,莫衷一是,在台湾JavaWorld论坛上,有网友贴出了Hibernate比JDBC性能更加优越的测试结果分析图,也有很多网友在诟病Hibernate在ORM的同时丧失了性能,到底真相在何方?由于今年做了一个基于Oracle的大型系统,需要支撑高并发数据访问量,在决定系统架构的时候,首席架构师选择了iBatis,而放弃了Hibernate,其中一个最大的考虑就是这个性能因素,可惜当初没有进行技术实际论证,于是有了今天的这个“考”,打算通过实际测试结果来验证一下Hibernate的性能情况,以澄清如下问题:
1. Hibernate ORM读写与JDBC方式读写在性能上孰优孰劣?
2. 优势多少?劣势又是几何?
依照lifejoy的思路下写以下一段代码:
package com.gmail.newmanhuang.learnhibernate; import java.util.Iterator; import java.util.List; import org.hibernate.SessionFactory; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.Criteria; import org.hibernate.criterion.Expression; import com.gmail.newmanhuang.learnhibernate.model.Person; import java.sql.*;
public class LearnHibernateMain {
private Configuration config; private SessionFactory sessionFactory; private Session session;
public static void main(String[] args) { LearnHibernateMain lh=new LearnHibernateMain(); //用hibernate创建10000条记录,分10次插入,每次1000条,每100条记录做一次批量插入 //lh.createPersons(10, 1000, 100); //用jdbc直接创建10000条记录,分10次插入,每次1000条,每100条记录做一次批量插入 lh.createPersonsByJDBC(10, 1000,100); }
//用hibernate创建person记录, loopNum为循环插入的次数,batchNum1为每次循环插入的记录数,batchNum2为物理批量插入记录数 private void createPersons(int loopNum,int batchNum1,int batchNum2){ setup(); System.out.println("hibernate record creating testing./r/n" + "loop times:" + loopNum + "/r/nbatch number:" + batchNum1);
for(int i=0;i<loopNum;i++){
|