婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫(kù) > 一文搞懂MySQL預(yù)編譯

一文搞懂MySQL預(yù)編譯

熱門標(biāo)簽:上海市三維地圖標(biāo)注 電話機(jī)器人是電腦呼號(hào)嗎 南寧外呼系統(tǒng)招商 怎么更改高德地圖標(biāo)注 機(jī)器人打電銷電話 云南大數(shù)據(jù)外呼系統(tǒng) 400電話到哪辦理優(yōu)惠 博樂電銷機(jī)器人 鄭州網(wǎng)絡(luò)外呼系統(tǒng)價(jià)錢

1、預(yù)編譯的好處

  大家平時(shí)都使用過JDBC中的PreparedStatement接口,它有預(yù)編譯功能。什么是預(yù)編譯功能呢?它有什么好處呢?

  當(dāng)客戶發(fā)送一條SQL語句給服務(wù)器后,服務(wù)器總是需要校驗(yàn)SQL語句的語法格式是否正確,然后把SQL語句編譯成可執(zhí)行的函數(shù),最后才是執(zhí)行SQL語句。其中校驗(yàn)語法,和編譯所花的時(shí)間可能比執(zhí)行SQL語句花的時(shí)間還要多。

  如果我們需要執(zhí)行多次insert語句,但只是每次插入的值不同,MySQL服務(wù)器也是需要每次都去校驗(yàn)SQL語句的語法格式,以及編譯,這就浪費(fèi)了太多的時(shí)間。如果使用預(yù)編譯功能,那么只對(duì)SQL語句進(jìn)行一次語法校驗(yàn)和編譯,所以效率要高。 

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

MySQL執(zhí)行預(yù)編譯分為如三步:

  • 執(zhí)行預(yù)編譯語句,例如:prepare myfun from 'select * from t_book where bid=?'
  • 設(shè)置變量,例如:set @str='b1'
  • 執(zhí)行語句,例如:execute myfun using @str

如果需要再次執(zhí)行myfun,那么就不再需要第一步,即不需要再編譯語句了:

  • 設(shè)置變量,例如:set @str='b2'
  • 執(zhí)行語句,例如:execute myfun using @str

通過查看MySQL日志可以看到執(zhí)行的過程:

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

使用Statement執(zhí)行預(yù)編譯就是把上面的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ù)

  默認(rèn)使用PreparedStatement是不能執(zhí)行預(yù)編譯的,這需要在url中給出useServerPrepStmts=true參數(shù)(MySQL Server 4.1之前的版本是不支持預(yù)編譯的,而Connector/J在5.0.5以后的版本,默認(rèn)是沒有開啟預(yù)編譯功能的)。

  例如:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true

  這樣才能保證mysql驅(qū)動(dòng)會(huì)先把SQL語句發(fā)送給服務(wù)器進(jìn)行預(yù)編譯,然后在執(zhí)行executeQuery()時(shí)只是把參數(shù)發(fā)送給服務(wù)器。

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ù)

  當(dāng)使用不同的PreparedStatement對(duì)象來執(zhí)行相同的SQL語句時(shí),還是會(huì)出現(xiàn)編譯兩次的現(xiàn)象,這是因?yàn)轵?qū)動(dòng)沒有緩存編譯后的函數(shù)key,導(dǎo)致二次編譯。如果希望緩存編譯后函數(shù)的key,那么就要設(shè)置cachePrepStmts參數(shù)為true。例如:

  jdbc:mysql://localhost:3306/test?useServerPrepStmts=truecachePrepStmts=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預(yù)編譯的詳細(xì)內(nèi)容,更多關(guān)于MySQL預(yù)編譯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySQL預(yù)編譯功能詳解
  • mysqli預(yù)處理編譯的深入理解
  • 源碼編譯安裝MySQL8.0.20的詳細(xì)教程
  • CentOS8部署LNMP環(huán)境之編譯安裝mysql8.0.29的教程詳解
  • linux下使用cmake編譯安裝mysql的詳細(xì)教程

標(biāo)簽:益陽 定西 白銀 杭州 恩施 秦皇島 寧夏 澳門

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《一文搞懂MySQL預(yù)編譯》,本文關(guān)鍵詞  一文,搞懂,MySQL,預(yù),編譯,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《一文搞懂MySQL預(yù)編譯》相關(guān)的同類信息!
  • 本頁收集關(guān)于一文搞懂MySQL預(yù)編譯的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 上犹县| 洞头县| 墨江| 托克托县| 霍州市| 两当县| 马龙县| 华池县| 吉安市| 思茅市| 平南县| 汝城县| 玛多县| 夏邑县| 历史| 松江区| 行唐县| 靖远县| 靖江市| 新泰市| 乌兰察布市| 阳曲县| 赫章县| 皮山县| 泸水县| 咸阳市| 久治县| 柞水县| 晴隆县| 雅安市| 临澧县| 新沂市| 太保市| 林口县| 邳州市| 铜陵市| 昆山市| 上杭县| 康马县| 沈丘县| 监利县|