Hibernate性能“暴差”引发的考证

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论坛上,有网友贴出了HibernateJDBC性能更加优越的测试结果分析图,也有很多网友在诟病HibernateORM的同时丧失了性能,到底真相在何方?由于今年做了一个基于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++){

     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值