论坛首页 Java企业应用论坛

Hibernate,JDBC性能探讨

浏览 11497 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-08-21  
个人的看法还是在
for(int i = 0 ; i < 10000 ; i ++) {  
            String sql = "insert into corporation(name,type) value('Tibco','IT')";  
            stmt.executeUpdate(sql);  
}
与hibernate的transction提交的问题上!如果在hibernate的for循环中将session的开启和关闭以及事务的开启提交全部放入其中,我想他们两个的效率比较就比较公平了!说到底,还是写代码的问题!
0 请登录后投票
   发表时间:2010-08-21  
个人的看法还是在
for(int i = 0 ; i < 10000 ; i ++) {  
            String sql = "insert into corporation(name,type) value('Tibco','IT')";  
            stmt.executeUpdate(sql);  
}
与hibernate的transction提交的问题上!如果在hibernate的for循环中将session的开启和关闭以及事务的开启提交全部放入其中,我想他们两个的效率比较就比较公平了!说到底,还是写代码的问题!
0 请登录后投票
   发表时间:2010-08-21  
JDBC架构的系统,1台服务器

HIBERNATE架构的系统,4台服务器。

看看哪个快哦~
0 请登录后投票
   发表时间:2010-08-21   最后修改:2010-08-21
lz 你看看 你写的代码
 for(int i = 0 ; i < 10000 ; i ++) {   
            String sql = "insert into corporation(name,type) value('Tibco','IT')";   
            stmt.executeUpdate(sql);   
        }   


1.for 循环有80%的时间都在 IO上..真正执行你sql 的时间很短
2.我们都知道 尽量不要再循环中新建类.

改成这样 试试

         Statement stmt = conn.createStatement();
	StringBuffer sb=new StringBuffer(); 
         for(int i = 0 ; i < 10000 ; i ++)
         {
           sb.append("insert into corporation(name,type) value('Tibco','IT')");   
         }
         stmt.addBatch(sb.toString()); 
         stmt.executeBatch();
  

0 请登录后投票
   发表时间:2010-08-21   最后修改:2010-08-21
3923075 写道
lz 你看看 你写的代码
 for(int i = 0 ; i < 10000 ; i ++) {   
            String sql = "insert into corporation(name,type) value('Tibco','IT')";   
            stmt.executeUpdate(sql);   
        }   


1.for 循环有80%的时间都在 IO上..真正执行你sql 的时间很短
2.我们都知道 尽量不要再循环中新建类.

改成这样 试试

         Statement stmt = conn.createStatement();
	StringBuffer sb=new StringBuffer(); 
         for(int i = 0 ; i < 10000 ; i ++)
         {
           sb.append("insert into corporation(name,type) value('Tibco','IT')");   
         }
         stmt.addBatch(sb.toString()); 
         stmt.executeBatch();
  


我估计这个超过mysql运行的最大长度了。
0 请登录后投票
   发表时间:2010-08-21  
kimmking 写道
3923075 写道
lz 你看看 你写的代码
 for(int i = 0 ; i < 10000 ; i ++) {   
            String sql = "insert into corporation(name,type) value('Tibco','IT')";   
            stmt.executeUpdate(sql);   
        }   


1.for 循环有80%的时间都在 IO上..真正执行你sql 的时间很短
2.我们都知道 尽量不要再循环中新建类.

改成这样 试试

         Statement stmt = conn.createStatement();
	StringBuffer sb=new StringBuffer(); 
         for(int i = 0 ; i < 10000 ; i ++)
         {
           sb.append("insert into corporation(name,type) value('Tibco','IT')");   
         }
         stmt.addBatch(sb.toString()); 
         stmt.executeBatch();
  


我估计这个超过mysql运行的最大长度了。


不太明白,为啥不用PreparedStatement的批量提交?
   String sql = "insert into corporation(name,type) value(?,?)";
   PreparedStatement prest = conn.prepareStatement(sql);   
      for(int x = 0; x < size; x++){           
         prest.setString(1, "Tibco");   
         prest.setString(2, "IT");        
         prest.addBatch();   
      }   
  prest.executeBatch();  


0 请登录后投票
   发表时间:2010-08-21  
感觉楼主还是做个公平的测试,个人觉得你没能比Hibernate更好的应用JDBC才是关键。
0 请登录后投票
   发表时间:2010-08-21   最后修改:2010-08-21
chrislee1982 写道
JDBC绝对比hibernate快,毋庸置疑!

zhuyan_zy 写道
此贴体现了框架存在的意义之一

这个例子恰恰说明,hibernate一定比蹩脚程序员写的JDBC代码快!!
 
1 请登录后投票
   发表时间:2010-08-21  
sswh 写道
chrislee1982 写道
JDBC绝对比hibernate快,毋庸置疑!

zhuyan_zy 写道
此贴体现了框架存在的意义之一

这个例子恰恰说明,hibernate一定比蹩脚程序员写的JDBC代码快!!
 

大家批评让我觉得相当惭愧,刚毕业没有什么经验,闹了个大笑话,大家就当娱乐一下,问题正如这位大哥所讲是JDBC代码写的有问题,修给一下
public static void main(String[] args) throws SQLException {
		Connection conn = getConn();
		conn.setAutoCommit(false);
		Date start = new Date();
		String sql = "insert into corporation(name,type) value(?,?)";   
		PreparedStatement prest = conn.prepareStatement(sql);      
		   for(int x = 0; x < 10000; x++){              
		      prest.setString(1, "Tibco");      
		      prest.setString(2, "IT");           
		      prest.addBatch();      
		   }      
		prest.executeBatch(); 
		conn.commit();
		conn.setAutoCommit(true);
		System.out.println("Total spent " + (new Date().getTime() - start.getTime()));
	}

   这样运行结果是1600毫秒左右,相比较Hibernate的8700毫秒,JDBC还是快的多。
0 请登录后投票
   发表时间:2010-08-21  
笑我痴狂 写道
首先得说jdbc肯定比hibernate快
这里楼主的程序写的不好,如果把jdbc改成batch提交  我想时间应该就很短了

现在来具体分析下:

jdbc测试:
没insert一条记录  就跟数据库打交道一次 ,这里一共连接了1000次数据库 光是连接数据库的时间就已经很长了

hibernate测试:
for(int i=0;i<1000;i++){
    。。。。
    session.save() ;
}


在这个过程中session保存对象时 ,是放在了session中 ,此时还没有真正的持久化到数据库,
在最后执行commit的时候,才真正的持久化到数据库 ,所以这1000个对象在同一时候被持久化到数据库中
在效率上来说 可想而知了


简单的说就是一桶水 ,执行jdbc的时候,每一次取一小瓢放到缸里

hibernate执行时,直接把一桶水倒到缸里 ,这样的测试当然是hibernate快了

小弟不才  哈哈哈哈哈哈哈哈哈


这个解释相当详细,学习了,我知道昨天的错误出在哪儿了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics