锁定老帖子 主题:Hibernate,JDBC性能探讨
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间: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的开启和关闭以及事务的开启提交全部放入其中,我想他们两个的效率比较就比较公平了!说到底,还是写代码的问题! |
|
返回顶楼 | |
发表时间: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的开启和关闭以及事务的开启提交全部放入其中,我想他们两个的效率比较就比较公平了!说到底,还是写代码的问题! |
|
返回顶楼 | |
发表时间:2010-08-21
JDBC架构的系统,1台服务器
HIBERNATE架构的系统,4台服务器。 看看哪个快哦~ |
|
返回顶楼 | |
发表时间: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(); |
|
返回顶楼 | |
发表时间: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运行的最大长度了。 |
|
返回顶楼 | |
发表时间: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(); |
|
返回顶楼 | |
发表时间:2010-08-21
感觉楼主还是做个公平的测试,个人觉得你没能比Hibernate更好的应用JDBC才是关键。
|
|
返回顶楼 | |
发表时间:2010-08-21
最后修改:2010-08-21
chrislee1982 写道 JDBC绝对比hibernate快,毋庸置疑!
zhuyan_zy 写道 此贴体现了框架存在的意义之一
这个例子恰恰说明,hibernate一定比蹩脚程序员写的JDBC代码快!! |
|
返回顶楼 | |
发表时间: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还是快的多。 |
|
返回顶楼 | |
发表时间: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快了 小弟不才 哈哈哈哈哈哈哈哈哈 这个解释相当详细,学习了,我知道昨天的错误出在哪儿了 |
|
返回顶楼 | |