天天看點

Jmeter性能測試(11)--JDBC Request之Query TypeJmeter性能測試(12)--關聯之正規表達式提取器

工作中遇到這樣一個問題:

需要準備10W條測試資料,利用jmeter中的JDBC Request向資料庫中批量插入這些資料(隻要主鍵不重複就可以,利用函數助手中的Random将主鍵的ID末尾五位數随機插入);

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

最後得出的結論是:如果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界面如下:

Jmeter性能測試(11)--JDBC Request之Query TypeJmeter性能測試(12)--關聯之正規表達式提取器

其中Query Type(SQL語句類型)包含十個類型,每個類型作用都不同,下面分别介紹。

1、Select statement

這是一個查詢語句類型;如果JDBC Request中的Query内容為一條查詢語句,則選擇這種類型。

PS:多個查詢語句(不使用參數的情況下)可以放在一起順序執行,需要設定Query Type為:Callable Statement;

    如果Query Type為:select Statement,則隻執行第一條select語句。

2、Update statement

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

PS:如果該類型下寫入多條update語句,依然隻執行第一條(原因同上,具體下面介紹)。

3、Callable statement

這是一個可調用語句類型,CallableStatement 為所有的 DBMS 提供了一種以标準形式調用已儲存過程的方法。

已儲存過程儲存在資料庫中,對已儲存過程的調用是 CallableStatement 對象所含的内容。

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

兩種形式都可帶有數量可變的輸入(IN 參數)、輸出(OUT 參數)或輸入和輸出(INOUT 參數)的參數,問号将用作參數的占位符。 

在 JDBC 中調用已儲存過程的文法如下所示。注意,方括号表示其間的内容是可選項;方括号本身并不是文法的組成部份。 

{call 過程名[(?, ?, ...)]},傳回結果參數的過程的文法為: {? = call 過程名[(?, ?, ...)]};

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

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

4、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

5、Rrepared update statement

Prepared update statement和Prepared select statement的用法是極為相似的,具體可以參照第四種類型。

6、Commit

commit的意思是:将未存儲的SQL語句結果寫入資料庫表;而在jmeter的JDBC請求中,同樣可以根據具體使用情況,選擇這種Query類型。

7、Rollback

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

8、AutoCommit(false)

MySQL預設操作模式就是autocommit自動送出模式。表示除非顯式地開始一個事務,否則每條SQL語句都被當做一個單獨的事務自動執行;

我們可以通過設定autocommit的值改變是否是自動送出autocommit模式;

而AutoCommit(false)的意思是AutoCommit(假),即将使用者操作一直處于某個事務中,直到執行一條commit送出或rollback語句才會結束目前事務重新開始一個新的事務。

9、AutoCommit(true)

這個選項的作用和上面一項作用相反,即:無論何種情況,都自動送出将結果寫入,結束目前事務開始下一個事務。

10、編輯(${})

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

如果需實作同時多個不同使用者使用不同的SQL,可以通過把整條SQL語句參數化來實作;(把SQL語句放在csv檔案中,然後在JDBC Request的Query 中使用參數代替 ${SQL_Statement})。

Jmeter性能測試(12)--關聯之正規表達式提取器