MySQL PreparedStatement
世界上的PreparedStatement有兩種
一種是PreparedStatement
另一種是MySQL的PreparedStatement
MySQL版本5.6.14
JDBC版本mysql-connector-java-5.1.6-bin.jar
MySQL JDBC的PreparedStatement僅僅在JAVA端進行了引數的替換。
和Oracle的軟解析,軟軟解析什麼的真是一點關係也沒有。
測試程式如下:
開啟MySQL查詢日誌
mysql> set @@global.general_log=on;
Query OK, 0 rows affected (0.00 sec)
結果如下,明顯只是變數的替換,並沒有任何預解析的過程。
使用useServerPrepStmts和cachePrepStmts顯式開啟預解析
程式如下:
檢視MySQL查詢日誌
顯式開啟預解析之後,確實可以做到一次解析,多次執行。
但是程式測試的結果,效能相差無幾。
我感覺MySQL 解析之後,能夠快取複用的資訊太少,所以沒有明顯的提升。
參考:
http://cs-css.iteye.com/blog/1847772
http://blog.csdn.net/axman/article/details/6913527
一種是PreparedStatement
另一種是MySQL的PreparedStatement
MySQL版本5.6.14
JDBC版本mysql-connector-java-5.1.6-bin.jar
MySQL JDBC的PreparedStatement僅僅在JAVA端進行了引數的替換。
和Oracle的軟解析,軟軟解析什麼的真是一點關係也沒有。
測試程式如下:
-
public class Test {
-
public static void main(String[] args) throws ClassNotFoundException,
-
SQLException {
-
long start = System.currentTimeMillis();
-
Class.forName("com.mysql.jdbc.Driver");
-
Connection connection = DriverManager
-
.getConnection(
-
"jdbc:mysql://127.0.0.1:3306/xx",
-
"xx", "xx");
-
-
connection.setAutoCommit(false);
-
PreparedStatement cmd = connection
-
.prepareStatement("insert into test values(?,?)");
-
-
for (int i = 0; i < 10; i++) {
-
cmd.setInt(1, i);
-
cmd.setString(2, "test");
-
cmd.executeUpdate();
-
}
-
connection.commit();
-
-
cmd.close();
-
connection.close();
-
-
long end = System.currentTimeMillis();
-
System.out.println(end - start);
-
-
}
- }
mysql> set @@global.general_log=on;
Query OK, 0 rows affected (0.00 sec)
結果如下,明顯只是變數的替換,並沒有任何預解析的過程。
- 95 Query SET autocommit=1
- 95 Query SET autocommit=0
- 95 Query insert into test values(0,'test')
- 95 Query insert into test values(1,'test')
- 95 Query insert into test values(2,'test')
- 95 Query insert into test values(3,'test')
- 95 Query insert into test values(4,'test')
- 95 Query insert into test values(5,'test')
- 95 Query insert into test values(6,'test')
- 95 Query insert into test values(7,'test')
- 95 Query insert into test values(8,'test')
- 95 Query insert into test values(9,'test')
- 95 Query commit
- 95 Query rollback
- 95 Quit
程式如下:
-
public class Test {
-
public static void main(String[] args) throws ClassNotFoundException,
-
SQLException {
-
StringBuilder builder=new StringBuilder(50);
-
builder.append("jdbc:mysql://127.0.0.1:3306/xx?");
-
builder.append("useServerPrepStmts=true&");
-
builder.append("cachePrepStmts=true&");
-
builder.append("prepStmtCacheSqlLimit=256&");
-
builder.append("prepStmtCacheSize=256");
-
-
long start = System.currentTimeMillis();
-
Class.forName("com.mysql.jdbc.Driver");
-
Connection connection = DriverManager
-
.getConnection(
-
builder.toString(),
-
"xx", "xx");
-
-
connection.setAutoCommit(false);
-
PreparedStatement cmd = connection
-
.prepareStatement("insert into test values(?,?)");
-
-
for (int i = 0; i < 10; i++) {
-
cmd.setInt(1, i);
-
cmd.setString(2, "test");
-
cmd.executeUpdate();
-
}
-
connection.commit();
-
-
cmd.close();
-
connection.close();
-
-
long end = System.currentTimeMillis();
-
System.out.println(end - start);
-
-
}
- }
- 96 Query SET autocommit=1
- 96 Query SET autocommit=0
- 96 Prepare insert into test values(?,?)
- 96 Execute insert into test values(0,'test')
- 96 Execute insert into test values(1,'test')
- 96 Execute insert into test values(2,'test')
- 96 Execute insert into test values(3,'test')
- 96 Execute insert into test values(4,'test')
- 96 Execute insert into test values(5,'test')
- 96 Execute insert into test values(6,'test')
- 96 Execute insert into test values(7,'test')
- 96 Execute insert into test values(8,'test')
- 96 Execute insert into test values(9,'test')
- 96 Query commit
- 96 Query rollback
- 96 Quit
但是程式測試的結果,效能相差無幾。
我感覺MySQL 解析之後,能夠快取複用的資訊太少,所以沒有明顯的提升。
參考:
http://cs-css.iteye.com/blog/1847772
http://blog.csdn.net/axman/article/details/6913527
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1151799/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL-07——JDBC、Properties、DBCP、PreparedstatementMySqlJDBC
- java preparedStatementJava
- java-Statement、PreparedStatement、PreparedStatement + 批處理 的區別Java
- JDBC教程之PreparedStatementJDBC
- 教程:使用PreparedStatement訪問DLA
- 使用PreparedStatement實現CRUD操作
- JDBC使用PreparedStatement的好處JDBC
- JDBC3——SQL隱碼攻擊、及其解決方法——Statement與PreparedStatement對比——PreparedStatement的CRUDJDBCSQL
- Statement和PreparedStatement之間的區別
- 使用PreparedStatement為佔位符?賦值賦值
- JDBC中PreparedStatement介面的執行邏輯JDBC
- JDBC PreparedStatement 實現原理【推薦閱讀】JDBC
- JDBC之Statement,PreparedStatement,CallableStatement的區別JDBC
- 20160408javaweb之JDBC ---PreparedStatementJavaWebJDBC
- 使用預處理PreparedStatement執行Sql語句SQL
- Java中Statement與PreparedStatement與CallableStatement之間的區別 - javarevisitedJava
- preparedstatement用insert時候後面自動補空格,如何解決?
- 如何快速的插入 100W資料到資料庫,使用PreparedStatement 最快實現!資料庫
- 使用PreparedStatement向資料表中插入、修改、刪除、獲取Blob型別的資料型別
- 【Mysql】MySQL管理工具MySQL UtilitiesMySql
- MySQL - 初識MySQLMySql
- 【MySQL】MySQL基礎MySql
- 【MySQL】MySQL 5.7 初探MySql
- mysql 索引( mysql index )MySql索引Index
- 【MySQL】mysql optimize tableMySql
- 「MySQL」 MySQL執行流程MySql
- MySQL入門--mysql命令MySql
- MySQL入門--MySQL安全MySql
- 【Mysql】修改mysql時區MySql
- 【MySQL】MySQL中的鎖MySql
- [mysql]ubuntu安裝mysqlMySqlUbuntu
- MySQL(六):MySQL之MVCCMySqlMVC
- Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql'MySql
- MySQL入門系列:MySQL概述MySql
- mysql + nodejs mysql篇(2)MySqlNodeJS
- 【MySQL(2)| MySQL索引機制】MySql索引
- 重返MySQL之MySQL基礎MySql
- 安裝mysql和mysql workbenchMySql