说明:本文转自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>
-
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
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时,性能反而低。
分享到:
相关推荐
Java 中 PreparedStatement 和 Statement 的区别 Java 中的 PreparedStatement 和 Statement 都是用于执行 SQL 语句的接口,但是它们之间存在一些关键的区别。 首先,从数据库执行 SQL 语句的角度来看,使用 ...
这种差异导致PreparedStatement对象执行速度更快,特别是在执行多次相同的SQL语句时。 其次,PreparedStatement对象可以避免SQL注入攻击。在 Statement 对象中,如果用户输入的数据包含恶意代码,例如 Drop 表名,...
jdbc中preparedStatement比Statement的好处
- **性能**:由于预编译,`PreparedStatement`通常比`Statement`更快,尤其是在大量重复执行相同SQL时。 - **安全性**:`PreparedStatement`通过占位符防止SQL注入,而`Statement`则容易受到这类攻击。 - **...
Java面试题34.jdbc中preparedStatement比Statement的好处.mp4
`PreparedStatement`是`Statement`接口的子接口,用于预编译SQL语句,并可以重复执行这些预编译过的SQL语句。这不仅能够提高应用程序的性能,还能提高安全性,因为它支持参数化查询,避免了SQL注入的风险。 #### 二...
一种可能的方法是通过日志配置,例如,启用MySQL的`Statement`和`PreparedStatement`日志,这样在执行时会打印出详细的SQL语句。 另外,开发工具如IntelliJ IDEA、Eclipse等,或者数据库管理工具如MySQL Workbench...
### PreparedStatement的详细...综上所述,无论从性能、安全性还是数据库无关性的角度,`PreparedStatement`都是比`Statement`更为优秀的选择,因此,在实际开发中,应尽可能地采用`PreparedStatement`来执行SQL语句。
#### 何时使用 Statement? - 当SQL语句简单,不会重复执行时。 - 对于读取数据的操作,如果数据量不大,可以考虑使用`Statement`。 - 当不需要参数化SQL语句时,例如只读操作。 #### 何时使用 PreparedStatement...
首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement() 方法创建,而 PreparedStatement 需要通过 Connection 对象的 prepareStatement() 方法创建,并且需要带有 SQL 语句。...
`PreparedStatement`的主要特点在于它可以预先编译SQL语句,并允许用户在执行前动态地设置SQL语句中的参数值,这使得它在执行相同或相似SQL语句时比普通的`Statement`更加高效。 #### 二、`PreparedStatement`与`...
NULL 博文链接:https://chaoyi.iteye.com/blog/2088080
在Java编程语言中,`PreparedStatement`是`java.sql`包中的一个接口,它继承自`Statement`类,并提供了预编译SQL语句的功能。预编译SQL语句的主要优势在于提高了执行效率和安全性。尤其在处理动态查询或频繁执行相同...
PreparedStatement对象的创建和预编译过程比Statement更为复杂和耗时。因此,在那些对性能要求极高且SQL语句几乎不重复执行的应用场景下,或许需要根据具体情况来权衡利弊。 总之,理解Statement和...
在Java编程中,PreparedStatement是Java SQL API中的一个接口,它是Statement接口的子接口。这个练习主要涉及如何使用PreparedStatement来插入宠物信息到数据库中。PreparedStatement的主要优势在于它的预编译能力和...
在Java的JDBC(Java Database Connectivity)中,与数据库交互的核心接口是Statement和PreparedStatement。这两个接口都是用于执行SQL语句的,但它们在特性和效率上有所不同。 Statement接口是最基本的SQL执行方式...
在实际开发中,为了提高效率和安全性,我们通常会使用PreparedStatement接口来代替Statement接口。 1. **PreparedStatement简介** PreparedStatement是Statement的一个子接口,它的主要优势在于预编译。预编译的...
### PreparedStatement 向数据库插入时间方法 #### 背景与问题描述 在Java应用程序中,我们经常需要将数据写入数据库。为了确保SQL查询的安全性和效率,通常会使用`PreparedStatement`来执行这样的操作。然而,在...
在数据库编程中,我们经常遇到两种执行SQL语句的方法:Statement和PreparedStatement。尽管Statement看起来更简洁,但在实际应用中,尤其是在使用ORM框架如MyBatis时,PreparedStatement成为了首选。那么,为什么...