论坛首页 Java企业应用论坛

为什么PrepareStatement和Batch性能相差不大,欢迎分析

浏览 11739 次
精华帖 (9) :: 良好帖 (0) :: 新手帖 (12) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-22   最后修改:2010-08-22
不同驱动实现,效率确实往往差别很大。
另外我其实很想知道Oracle OCI相比Thin,性能到底大概可以提高多少...手头没有环境,不知道哪位同仁能透露一下。
0 请登录后投票
   发表时间:2010-08-23  
sswh 写道
用Statement,使用批处理,但autoCommit=true的时候,
结果如下:

清空表
用批处理4插入数据:
批量更新成功 10000 条记录!
1719
================================

按上面的测试,影响性能最大的应该是

事务的大小,
批处理的影响次之,
PreparedStatement和Statement似乎区别不是很大

PreparedStatement和Statement区别不大是因为sql并没有发生变化
0 请登录后投票
   发表时间:2010-08-24  
mysql的JDBC Batch做得很烂的,如果是Oracle,性能会相差很大的。

MySQL需要使用一个Insert多个Values的方式性能才会好。
0 请登录后投票
   发表时间:2010-08-24  
确实用 Oracle 就看出了差距
不过本地数据库 和非本地数据库 时间也差好多。
0 请登录后投票
   发表时间:2010-08-27  
murainwood 写道
不同驱动实现,效率确实往往差别很大。
另外我其实很想知道Oracle OCI相比Thin,性能到底大概可以提高多少...手头没有环境,不知道哪位同仁能透露一下。



如果不是想找麻烦, 建议你别用oci driver. 另外, 我想提醒的是, 现在JAVA的速度和用NATIVE代码, 性能几乎没有什么差异。
0 请登录后投票
   发表时间:2010-08-30  
感觉以前的经验,oci driver很多bug的,少用为好
0 请登录后投票
   发表时间:2010-08-31  
呵呵,兄弟
被投了新手吧、啥了吧,要答题了吧
通过此帖,看出楼主的求真务实的态度——非常好,心态比那些投新手的人强太多了
大家都喜欢不明真相的围观、喷口水;看看很多人的扯谈,楼主明明说是mysql,最后扯到了oracle
现在大家看东西都很浮躁,被习惯性批判所左右了思想和心态——值得警惕啊

祝楼主答题愉快,保持一颗求真务实的心态

前行的路上,有你我他同行



peterwei 写道
Batch和PrepareStatement比Statement并没有实质性的提高,只是一小点(这个倒是让我奇怪)。
--------------------------------------
ok,结果出来了。确实是setAutoCommit(false);不起作用。原来默认装的mysql数据库不是InnoDB,而是MyISAM,所以是没有事务的。楼上的skzr.org说得对。改数据库后,重测了一下,得到我想要的结果。

清空表
普通的Statement插入数据:
插入数据量:10000
<运行时间: 17.828 秒>
运行时间:17828 毫秒
17.828
================================
清空表
通过PrepareStatement插入数据:
插入数据量:10000
<运行时间: 2.594 秒>
运行时间:2594 毫秒
2.594
================================
清空表
用批处理插入数据:
批量更新成功 10000 条记录!
<运行时间: 2.187 秒>
运行时间:2187 毫秒
2.187
================================

0 请登录后投票
   发表时间:2010-08-31  
兄弟, 我投个精华, 把票数拉回来。 8票~~~

给个总结:
在没有事务的情况下, Batch和PrepareStatement比Statemen 是没有什么区别的。 Batch所能获得优势就是CPU连续处理, 差异估计不大。我猜猜也就1-5%的差异。
有事务的情况, 我相信这个差异是很大的。 这个情况可以分为:
Batch一次提交多少条SQL, 或者一条SQL
PrepareStatement/Statemen  一次提交一条为一个事务, 或者一个事务包含多个SQL。 这些性能都是有比较大的差异的。

楼主对细节关心说明考虑问题很周到。




0 请登录后投票
   发表时间:2010-08-31  
sdh5724 写道
兄弟, 我投个精华, 把票数拉回来。 8票~~~

给个总结:
在没有事务的情况下, Batch和PrepareStatement比Statemen 是没有什么区别的。 Batch所能获得优势就是CPU连续处理, 差异估计不大。我猜猜也就1-5%的差异。
有事务的情况, 我相信这个差异是很大的。 这个情况可以分为:
Batch一次提交多少条SQL, 或者一条SQL
PrepareStatement/Statemen  一次提交一条为一个事务, 或者一个事务包含多个SQL。 这些性能都是有比较大的差异的。

楼主对细节关心说明考虑问题很周到。




你的结论下的不对,不要误导大众

Batch, PrepareStatement, Statemen 和事务没有任何关系!

batch , preparestatement 需要数据库和jdbc驱动的双方面支持
首先, dbms 要提供批处理和预编译的功能
其次, jdbc 对上述2个功能要有所支持
上述2着缺一不可。

至于事务方面, 每一语句一事务, 和手动划分事务, 当然后者要快的多。但这个和Batch, PrepareStatement, Statemen没有任何关系。
0 请登录后投票
   发表时间:2010-08-31  
说的是2个不同的东西, 何来误导之说? 楼主的测试已经是基于mysql非事务表了。

谁都知道JDBC/DBMS需要有对应的支持功能。 
0 请登录后投票
论坛首页 Java企业应用版

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