1、JDBC Request元件介紹
JDBC Request
元件可以向資料庫傳送一個JDBC請求(傳送SQL語句),它需要和配置元件中的JDBC Connection Configuration
元件配合使用。
即:在使用JDBC Request
元件時,必須設定一個JDBC連線配置元件,以提供連線的目標資料庫。
2、JDBC Request元件介面詳解
新增JDBC Request
元件操作:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> JDBC Request
。
JDBC Request
元件的介面,如下圖所示:
介面詳細說明:
- 名稱:
JDBC Request
元件的自定義名稱,見名知意最好。 - 註釋:即新增一些備註資訊,對該
JDBC Request
元件的簡短說明,以便後期回顧時檢視。
(1)Variable Name Bound to Pool
:繫結一個資料庫的連結。
Variable Name of Pool declared in JDBC Connection Configuration
:填寫資料庫連線池的名稱。也就是填寫與你需要呼叫的jdbc connection configuration
元件中定義的變數名(Variable Name
)保持一致。
(2)SQL Query
:SQL查詢
Query Type
:選擇SQL語句型別。不同形式的SQL語句,需要選擇對應的SQL語句型別。(具體介紹看下面補充)Query:
:裡面填入查詢資料庫資料的SQL語句(填寫的SQL語句時,單條SQL語句末尾不要加;
,多條SQL語句需要加;
)
(3)第三部分內容
Parameter values
:填寫引數值。表示我們要新增到SQL中的資料(SQL語句中有佔位符的時候使用),需要新增不同資料的時候,可以使用引數化。多個引數用逗號分隔。Parameter types
:填寫上面資料的引數型別,與上面的引數一一對應。比如varchar
、tinyint(m)
、smallint(m)
等。填寫多個型別的時候,用逗號分隔。Variable names
:儲存SQL語句返回結果的變數名,與資料庫欄位對應,多個欄位儲存時,用逗號分隔。用於儲存由Select語句、Prepared Select語句或CallableStatement返回的值(查詢語句)。
注意,當與CallableStatement一起使用時,變數列表的順序必須與呼叫返回的OUT引數相同。如果變數名少於OUT引數,則只有指定變數名的部分能返回;如果存在更多的變數名,則多餘變數將被忽略。Result variable name
:建立一個物件變數,儲存所有返回結果。也就是定義用於存放select操作返回的查詢結果集。Query timeout
:設定查詢超時的時間。Handle result set
:定義如何處理由callable statements
語句返回的結果。(在涉及儲存過程的時候可能會用上)Store As String
(預設):所有變數都作為字串格式進行儲存。不會遍歷ResultSet。Store As Object
:變數名稱列表中的ResultSet型別的變數將被儲存為物件。不會遍歷ResultSet。Count Records
:結果集型別的變數將通過顯示記錄的計數作為結果進行迭代。變數將被儲存為字串。
說明:
Parameter values
和Parameter types
:是成對出現的,且SQL語句中有多少個?
,這裡就必須有多少對引數鍵值對。假設SQL語句為select * from member where id=2
,那麼可以設定Parameter values
為${id}
,Parameter types
為int
。
3、補充:Query Type
型別說明
在JMeter的JDBC Request
元件中,Query Type
(SQL語句型別)包含十個型別,每個型別作用都不同。
(1)Select Statement(重點)
這是一個查詢語句型別;如果JDBC Request
中的Query內容為一條查詢語句,則選擇這種型別。
提示:
- 如果有多條查詢語句(不帶有佔位符的情況下),可以放在一起順序執行,每天SQL語句用分號分隔,且需要設定
Query Type
為Callable Statement
。 - 執行多條查詢語句時,如果
Query Type
選擇為Select Statement
,只會執行第一條查詢語句。 - 執行多條查詢語句時,如果
Query Type
選擇為Prepared Select Statement
,也只會執行第一條查詢語句。
前提:在JMeter中執行多條查詢語句時,需要在
JDBC Connection Configuration
元件中配置Database URL
新增?allowMultiQueries=true
,例如:jdbc:mysql://127.0.0.1:3306/ecshop4?serverTimezone=GMT&allowMultiQueries=true
。不填寫,則會報錯。
(2)Update Statement(重點)
這是一個更新語句型別,包含update
、insert
和delete
操作。如果JDBC Request
元件中的Query內容為一條更新語句,則選擇這種型別。
提示:
- 如果執行多條更新語句(不帶有佔位符的情況下),可以放在一起順序執行,每天SQL語句用分號分隔。
- 且
Query Type
設定為Update Statement
、Prepared Update Statement
和Callable Statement
都可以(親測5.4.1版本)。 - 前提是
Database URL
新增了allowMultiQueries=true
引數,如上。 - 如果新增中文亂碼,則需要在
Database URL
新增characterEncoding=UTF-8
引數。 - 如果多條語句中夾雜Select語句,則自動忽略。
- 多條語句中,若第一條語句為Select語句,則報錯。
(3)Prepared Select Statement(重點)
Select Statement
用於為一條SQL語句生成執行計劃,如果只執行一條查詢SQL語句,Select Statement
是最好的型別。
Prepared Select Statement
用於繫結變數重用執行計劃,對於多次執行的SQL語句,Prepared Select Statement無疑是最好的型別
生成執行計劃極為消耗資源,兩種實現速度差距可能成百上千倍。
提示:
Prepared Select Statement
的第一次執行消耗是很高的,它的效能體現在後面的重複執行。
總結:
Prepared Select Statement
是預編譯的,對於批量處理可以大大提高效率。所以對於多條查詢語句的執行,選擇這個是最好的。
(4)Prepared Update Statement(重點)
Prepared Update Statement
和Prepared Select Statement
的用法是極為相似的,具體可以參照前三種型別的關係。
(5)Callable Statement
這是一個可呼叫語句型別,Callable Statement
為所有的 DBMS(資料庫管理系統) 提供了一種以標準形式呼叫已儲存過程的方法。
簡單的理解:
- 也就是說如果需要呼叫儲存過程就選這個這個型別。具體的使用,可以自行去擴充。
Callable Statement
語句型別,只要語法正確,任何語句,再多的條數都能支援。
(6)Commit
Commit
的意思是:將未儲存的SQL語句結果寫入資料庫表,而在JMeter的JDBC請求中,同樣可以根據具體使用情況,選擇這種Query型別。(無特殊情況,不推薦使用)
(7)Rollback
Rollback
指的是:撤銷指定SQL語句的過程,而在JMeter的JDBC請求中,同樣可以根據需要使用這種型別。(無特殊情況,不推薦使用)
(8)AutoCommit(false)
MySQL預設操作模式就是AutoCommit
自動提交模式。表示除非顯式地開始一個事務,否則每條SQL語句都被當做一個單獨的事務自動執行。
我們可以通過設定AutoCommit
的值,改變是否執行自動提交模式。
而AutoCommit(false)
的意思是不執行自動提交模式,即將使用者操作一直處於某個事務中,直到執行一條Commit
提交或Rollback
語句,才會結束當前事務,重新開始一個新的事務。
(9)AutoCommit(true)
這個選項的作用和上面AutoCommit(false)
作用相反,即:無論何種情況,都自動提交將結果寫入資料庫,並結束當前事務開始下一個事務。
(10)編輯(${}
)
如果需實現同時多個不同使用者使用不同的SQL,可以通過把整條SQL語句引數化來實現。
把SQL語句放在CSV檔案中,然後在JDBC Request
的Query中,使用引數化 ${SQL_Statement}
代替。