jmeter(十一)JDBC Request之Query Type

工做中遇到這樣一個問題:html

須要準備10W條測試數據,利用jmeter中的JDBC Request向數據庫中批量插入這些數據(只要主鍵不重複就能夠,利用函數助手中的Random將主鍵的ID末尾五位數隨機插入);數據庫

響應數據報錯:Can not issue data manipulation statements with executeQuery().後來查閱了不少資料,才發現跟JDBC Request中的Query Type類型選擇有關;dom

最後得出的結論是:若是SQL語句是update、insert等更新語句,應該使用statement的execute()方法;若是使用statement的executeQuery()就會出現報錯。函數

PS:以前的博客有簡單介紹JDBC Request怎樣使用,傳送門:http://www.cnblogs.com/imyalost/p/5947193.html性能

 

下面主要說jmeter的JDBC Request請求中的Query Type測試

JDBC Request界面以下:spa

其中Query Type(SQL語句類型)包含十個類型,每一個類型做用都不一樣,下面分別介紹。.net

一、Select statementhtm

這是一個查詢語句類型;若是JDBC Request中的Query內容爲一條查詢語句,則選擇這種類型。對象

PS:多個查詢語句(不使用參數的狀況下)能夠放在一塊兒順序執行,須要設置Query Type爲:Callable Statement;

    若是Query Type爲:select Statement,則只執行第一條select語句。

 

二、Update statement

這是一個更新語句類型(包含insert和update);若是JDBC Request中的Query內容爲一條更新語句,則選擇這種類型。

PS:若是該類型下寫入多條update語句,依然只執行第一條(緣由同上,具體下面介紹)。

 

三、Callable statement

這是一個可調用語句類型,CallableStatement 爲全部的 DBMS 提供了一種以標準形式調用已儲存過程的方法。

已儲存過程儲存在數據庫中,對已儲存過程的調用是 CallableStatement 對象所含的內容。

這種調用是用一種換碼語法來寫的,有兩種形式:一種形式帶結果參數,另外一種形式不帶結果參數;結果參數是一種輸出 (OUT) 參數,是已儲存過程的返回值。

兩種形式均可帶有數量可變的輸入(IN 參數)、輸出(OUT 參數)或輸入和輸出(INOUT 參數)的參數,問號將用做參數的佔位符。 

在 JDBC 中調用已儲存過程的語法以下所示。注意,方括號表示其間的內容是可選項;方括號自己並非語法的組成部份。 

{call 過程名[(?, ?, ...)]},返回結果參數的過程的語法爲: {? = call 過程名[(?, ?, ...)]};

不帶參數的已儲存過程的語法相似:{call 過程名}。

更詳細的使用方法可參考這篇文章:http://blog.csdn.net/imust_can/article/details/6989954

 

四、Prepared select statement

statement用於爲一條SQL語句生成執行計劃(這也是爲何select statement只會執行第一條select語句的緣由),若是隻執行一次SQL語句,statement是最好的類型;

Prepared statement用於綁定變量重用執行計劃,對於屢次執行的SQL語句,Prepared statement無疑是最好的類型(生成執行計劃極爲消耗資源,兩種實現速度差距可能成百上千倍);

PS:PreparedStatement的第一次執行消耗是很高的. 它的性能體如今後面的重複執行。

更詳細的解釋請參考這一篇文章:http://blog.csdn.net/jiangwei0910410003/article/details/26143977

 

五、Prepared update statement

Prepared update statement和Prepared select statement的用法是極爲類似的,具體能夠參照第四種類型。

 

六、Commit

commit的意思是:將未存儲的SQL語句結果寫入數據庫表;而在jmeter的JDBC請求中,一樣能夠根據具體使用狀況,選擇這種Query類型。

 

七、Rollback

rollback指的是:撤銷指定SQL語句的過程;在jmeter的JDBC請求中,一樣能夠根據須要使用這種類型。

 

八、AutoCommit(false)

MySQL默認操做模式就是autocommit自動提交模式。表示除非顯式地開始一個事務,不然每條SQL語句都被當作一個單獨的事務自動執行;

咱們能夠經過設置autocommit的值改變是不是自動提交autocommit模式;

而AutoCommit(false)的意思是AutoCommit(假),即將用戶操做一直處於某個事務中,直到執行一條commit提交或rollback語句纔會結束當前事務從新開始一個新的事務。

 

九、AutoCommit(true)

這個選項的做用和上面一項做用相反,即:不管何種狀況,都自動提交將結果寫入,結束當前事務開始下一個事務。

 

十、編輯(${})

jmeter中的JDBC請求中的SQL語句是沒法使用參數的,好比: SELECT * FROM ${table_name} 是無效的。

若是需實現同時多個不一樣用戶使用不一樣的SQL,能夠經過把整條SQL語句參數化來實現;(把SQL語句放在csv文件中,而後在JDBC RequestQuery 中使用參數代替 ${SQL_Statement})

備註:後面的七項項涉及到數據庫的事務控制等知識點,若是有不明白的地方請自行查詢相關知識,或等待幾天,我會將數據庫事務管理等知識發佈上來,供參考。。。

相關文章
相關標籤/搜索