PreparedStatement真的比Statement快吗?

说明:本文转自http://ivanl.iteye.com/blog/49129

 

从开始写java程序就一直被灌输着一种思想,如果使用jdbc一定要使用PreparedStatement,而不要使用Statement对象。
其中的原因有好多,比如可以防止SQL注入攻击,防止数据库缓冲池溢出,代码的可读性,可维护性。这些都很正确。
但是还有一点人们经常提的就是PreparedStatement能够显著的提高执行效率。
看了两篇关于PreparedStatement和Statement的帖子
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=10397&start=0&tstart=0
http://www.iteye.com/topic/5631?page=1
里面提到,PreparedStatement并不一定比Statement快,于是想自己动手测试一下
一共分5种情况测试

Java代码 <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="14" height="15" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"> <param name="src" value="http://ivanl.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf"> <embed type="application/x-shockwave-flash" width="14" height="15" src="http://ivanl.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf"></embed></object>
  1. stmt      pre-stmt    
  2. --1 :每次都单独连数据库-- 100 条  
  3. 21.936    22.076   
  4. 22.05       22.051       
  5. 22.172    22.178     
  6. --2 :Stmt使用相同的SQL语句,参数值也相同-- 100 条  
  7. 0.78        0.796    
  8. 0.718       0.749    
  9. 0.749       0.764    
  10. --3 :Stmt使用相同的SQL语句,参数值不同-- 100 条  
  11. 0.967       0.749    
  12. 0.78        0.874    
  13. 0.749       0.749    
  14. --4 :Stmt使用相同的SQL语句,参数值也相同-- 10000 条  
  15. 33.079    36.154     
  16. 34.156    39.306     
  17. 34.359    36.138     
  18. --5 :Stmt使用相同的SQL语句,参数值不同-- 10000 条  
  19. 32.799    34.125     
  20. 32.564    35.53      
  21. 35.701    34.952     
  22. 32.582    40.798     
  23. 38.893    42.345     
  24. 35.082    41.736     
stmt	  pre-stmt	
--1:每次都单独连数据库--100条
21.936	22.076
22.05	  22.051	
22.172	22.178	
--2:Stmt使用相同的SQL语句,参数值也相同--100条
0.78	  0.796	
0.718	  0.749	
0.749	  0.764	
--3:Stmt使用相同的SQL语句,参数值不同--100条
0.967	  0.749	
0.78	  0.874	
0.749	  0.749	
--4:Stmt使用相同的SQL语句,参数值也相同--10000条
33.079	36.154	
34.156	39.306	
34.359	36.138	
--5:Stmt使用相同的SQL语句,参数值不同--10000条
32.799	34.125	
32.564	35.53	
35.701	34.952	
32.582	40.798	
38.893	42.345	
35.082	41.736	


分析:
第一种情况:
由于我测试时采用jdbc直接链接数据库,所以在第一种情况下插入速度很慢,时间都消耗在了数据库链接的创建上了,符合常理,没什么疑义。
第二种情况:
由于使用Statement插入时sql语句都相同,我通过阅读上面的两篇帖子,猜想可能是Statement语句也被DB缓存了,所以跟
PreparedStatement速度差不多,我想如果每次插入的sql都不同,那么Statement应该慢下来了吧。
第三种情况:
并非像我在执行第二种情况时想象的那样,PreparedStatement还是跟Statement差不多,于是我想是不是数据量不够大呀,于是我增大了
插入数据量,希望PreparedStatement能够比Statement快些
第四/五种情况:
测试结果PreparedStatement反到更慢了。

PreparedStatement什么情况下才会比Statement快?那位大侠来指点一下!


说明:测试代码省略,可以看原稿。




说明:昨晚(20090331),我自己也做了个简单测试。

数据库是MySQL,版本号是5.0.51,使用PreparedStatement和Statement各做一轮100次的查询(每次都使用新的conn)。

得到的测试结果也是令人大跌眼镜:PreparedStatement比Statement耗时还多(接近2倍),与以前的(惯性)知识恰恰相反。

晕了,今天我上网Google,发现不少人做过这种试验。

上面的这篇帖子写得不错,很多人参与了辩论,越辩越明。


结论大致是两点:

对于Oracle(非常肯定,实践证明+测试结果表明)和PostgreSQL8(较肯定),使用PreparedStatement时,性能更高;
对于MySQL(非常肯定,测试结果表明),使用PreparedStatement时,性能反而低。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值