亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL預編譯功能詳解

 更新時間:2017年10月09日 14:34:53   作者:gdwkong  
這篇文章主要為大家詳細介紹了MySQL預編譯功能的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文為大家分享了MySQL預編譯功能,供大家參考,具體內容如下

1、預編譯的好處

  大家平時都使用過JDBC中的PreparedStatement接口,它有預編譯功能。什么是預編譯功能呢?它有什么好處呢?
  當客戶發(fā)送一條SQL語句給服務器后,服務器總是需要校驗SQL語句的語法格式是否正確,然后把SQL語句編譯成可執(zhí)行的函數(shù),最后才是執(zhí)行SQL語句。其中校驗語法,和編譯所花的時間可能比執(zhí)行SQL語句花的時間還要多。
  如果我們需要執(zhí)行多次insert語句,但只是每次插入的值不同,MySQL服務器也是需要每次都去校驗SQL語句的語法格式,以及編譯,這就浪費了太多的時間。如果使用預編譯功能,那么只對SQL語句進行一次語法校驗和編譯,所以效率要高。

2、MySQL執(zhí)行預編譯

MySQL執(zhí)行預編譯分為如三步:
執(zhí)行預編譯語句,例如:prepare myfun from 'select * from t_book where bid=?'
設置變量,例如:set @str='b1'
執(zhí)行語句,例如:execute myfun using @str
如果需要再次執(zhí)行myfun,那么就不再需要第一步,即不需要再編譯語句了:
設置變量,例如:set @str='b2'
執(zhí)行語句,例如:execute myfun using @str
通過查看MySQL日志可以看到執(zhí)行的過程:

3、使用Statement執(zhí)行預編譯

使用Statement執(zhí)行預編譯就是把上面的SQL語句執(zhí)行一次。

Connection con = JdbcUtils.getConnection();
Statement stmt = con.createStatement();
stmt.executeUpdate("prepare myfun from 'select * from t_book where bid=?'");
stmt.executeUpdate("set @str='b1'");
ResultSet rs = stmt.executeQuery("execute myfun using @str");
while(rs.next()) {
 System.out.print(rs.getString(1) + ", ");
 System.out.print(rs.getString(2) + ", ");
 System.out.print(rs.getString(3) + ", ");
 System.out.println(rs.getString(4));
}

stmt.executeUpdate("set @str='b2'");
rs = stmt.executeQuery("execute myfun using @str");

while(rs.next()) {
 System.out.print(rs.getString(1) + ", ");
 System.out.print(rs.getString(2) + ", ");
 System.out.print(rs.getString(3) + ", ");
 System.out.println(rs.getString(4));
}

rs.close();
stmt.close();
con.close();

4、useServerPrepStmts參數(shù)

  默認使用PreparedStatement是不能執(zhí)行預編譯的,這需要在url中給出useServerPrepStmts=true參數(shù)(MySQL Server

4.1之前的版本是不支持預編譯的,而Connector/J在5.0.5以后的版本,默認是沒有開啟預編譯功能的)。

  例如:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true
  這樣才能保證mysql驅動會先把SQL語句發(fā)送給服務器進行預編譯,然后在執(zhí)行executeQuery()時只是把參數(shù)發(fā)送給服務器。

Connection con = JdbcUtils.getConnection();
String sql = "select * from t_book where bid=?";
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
 System.out.print(rs.getString(1) + ", ");
 System.out.print(rs.getString(2) + ", ");
 System.out.print(rs.getString(3) + ", ");
 System.out.println(rs.getString(4));
}

pstmt.setString(1, "b2");
rs = pstmt.executeQuery();
while(rs.next()) {
 System.out.print(rs.getString(1) + ", ");
 System.out.print(rs.getString(2) + ", ");
 System.out.print(rs.getString(3) + ", ");
 System.out.println(rs.getString(4));
}

rs.close();
pstmt.close();
con.close();

5、cachePrepStmts參數(shù)

  當使用不同的PreparedStatement對象來執(zhí)行相同的SQL語句時,還是會出現(xiàn)編譯兩次的現(xiàn)象,這是因為驅動沒有緩存編譯后的函數(shù)key,導致二次編譯。如果希望緩存編譯后函數(shù)的key,那么就要設置cachePrepStmts參數(shù)為true。例如:
  jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&cachePrepStmts=true

Connection con = JdbcUtils.getConnection();
String sql = "select * from t_book where bid=?";
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "b1");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
 System.out.print(rs.getString(1) + ", ");
 System.out.print(rs.getString(2) + ", ");
 System.out.print(rs.getString(3) + ", ");
 System.out.println(rs.getString(4));
}

pstmt = con.prepareStatement(sql);
pstmt.setString(1, "b2");
rs = pstmt.executeQuery();
while(rs.next()) {
 System.out.print(rs.getString(1) + ", ");
 System.out.print(rs.getString(2) + ", ");
 System.out.print(rs.getString(3) + ", ");
 System.out.println(rs.getString(4));
}

rs.close();
pstmt.close();
con.close();


6、打開批處理

MySQL的批處理也需要通過參數(shù)來打開:rewriteBatchedStatements=true

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • mysql字符集和數(shù)據(jù)庫引擎修改方法分享

    mysql字符集和數(shù)據(jù)庫引擎修改方法分享

    使用虛擬主機空間上的phpmyadmin操作數(shù)據(jù)庫的時候,如果看到phpmyadmin首頁上顯示的MySQL 字符集為cp1252 West European (latin1),當我們導入數(shù)據(jù)時就會出現(xiàn)亂碼
    2012-02-02
  • linux下mysql忘記密碼的解決方法

    linux下mysql忘記密碼的解決方法

    這篇文章主要為大家詳細介紹了linux下mysql忘記密碼的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 解決MySQL中的Slave延遲問題的基本教程

    解決MySQL中的Slave延遲問題的基本教程

    這篇文章主要介紹了解決MySQL中的Slave延遲問題的基本教程,文中針對不同情況給出了一些具體的解決方法,需要的朋友可以參考下
    2015-11-11
  • MySQL中的批量修改、插入操作數(shù)據(jù)庫

    MySQL中的批量修改、插入操作數(shù)據(jù)庫

    在平常的項目中,我們會需要批量操作數(shù)據(jù)庫的時候,例如:批量修改,批量插入,那我們不應該使用 for 循環(huán)去操作數(shù)據(jù)庫,這樣會導致我們反復與數(shù)據(jù)庫發(fā)生連接和斷開連接,影響性能和增加操作時間,所以可以使用SQL 批量修改的方式去操作數(shù)據(jù)庫,感興趣的朋友一起學習下吧
    2023-09-09
  • MySQL中對于NULL值的理解和使用教程

    MySQL中對于NULL值的理解和使用教程

    這篇文章主要介紹了MySQL中對于NULL值的理解和使用教程,是MySQL入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • 阿里云服務器安裝Mysql數(shù)據(jù)庫的詳細教程

    阿里云服務器安裝Mysql數(shù)據(jù)庫的詳細教程

    這篇文章主要介紹了阿里云服務器安裝Mysql數(shù)據(jù)庫的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 基于mysql實現(xiàn)group by取各分組最新一條數(shù)據(jù)

    基于mysql實現(xiàn)group by取各分組最新一條數(shù)據(jù)

    這篇文章主要介紹了基于mysql實現(xiàn)group by取各分組最新一條數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • MySQL并行DDL的實現(xiàn)方法

    MySQL并行DDL的實現(xiàn)方法

    本文詳細介紹了MySQL8.0.27并行DDL的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-10-10
  • windows?64位下mysql8.0.25安裝配置教程(最詳細!)

    windows?64位下mysql8.0.25安裝配置教程(最詳細!)

    之前一直在用 5.7 版本,竟然一下子跳到 8.0了,下面這篇文章主要給大家介紹了關于在windows?64位下mysql8.0.25安裝配置教程,文章通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • mysql 列轉行的技巧(分享)

    mysql 列轉行的技巧(分享)

    下面小編就為大家?guī)硪黄猰ysql 列轉行的技巧(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03

最新評論