提示:
關於JMeter如何連線MySQL資料庫,前面文章已經詳解的講解過了。因為配置資料庫連是比較固定的步驟,這裡就不重複講解了。
本篇文章主要詳細說明,使用
JDBC Request
元件,如何對資料庫進行更新的各種操作。
JMeter中更新語句的操作步驟:
- 新增測試計劃。
- 新增執行緒組,設定執行緒組的次數。
- 新增
JDBC Connection Configuration
元件,配置資料庫連線。 - 新增
JDBC Request
請求,編寫SQL語句,進行引數化。 - 執行指令碼,傳送SQL請求。
- 新增察看結果樹,檢視結果。
說明:更新操作包含
insert
、update
、delete
三種操作,都是一樣性質的,所以我們就以insert
操作為例進行說明。
1、執行一條insert語句
使用JMeter傳送一條insert
語句非常的簡單。
在JDBC Request
元件中做如下操作:
- 選擇資料庫連線配置。
- 選擇
Query Type
:因為是執行一條insert
語句,所以選擇Update Statement
即可。 - 把完整一條
insert
語句,輸入到Query
文字框中。
如下圖所示:
說明:這是最基礎的
insert
操作,傳送了一條固定的insert
請求。
2、insert語句實現引數化
JMeter中在insert
請求中實現引數化也非常的簡單。
在JDBC Request
元件中做如下操作:
- 選擇資料庫連線配置。
- 選擇
Query Type
:因為是執行一條insert
語句,所以選擇Update Statement
即可。 - 把完整一條
insert
語句,輸入到Query
文字框中。 - 把需要引數化的部分,替換成引數化變成的引用即可。
使用函式助手為例進行演示,如下圖所示:
說明:其他形式的引數化也都可以,如利用CSV這個元件去做語句的引數化。本例中是用函式助手方便演示。
提示:如果有些欄位是自增長的值或者是有預設值,那麼就可以不寫,讓其自動填充。
3、一次執行多條insert語句
使用JMeter傳送一次執行多條insert
語句非常的簡單,就是直接寫入多條insert
語句,之間用;
分隔開。
在JDBC Request
元件中做如下操作:
- 選擇資料庫連線配置。
Database URL
後增加一個引數allowMultiQueries=true
,才可以執行多條SQL語句(重點)。- 選擇
Query Type
:我們可以選擇Update Statement
、Prepared Update Statement
和Callable Statement
,這三種型別語句都可以。
選擇Update Statement
型別,執行一條insert
語句傳送一次請求。
而選擇Prepared Update Statement
和Callable Statement
型別,則全程只傳送一起請求。 - 把完整一條
insert
語句,輸入到Query
文字框中。
如下圖所示:
4、使用Beanshell生成加密資料示例
我們在更新資料庫的時候,有時候會有部分資料直接插入是不可以的,需要加密處理。
那麼就可以使用BeanShell 取樣器元件完成對資料的加密操作。
然後把加密好的資料,儲存到JMeter的執行緒變數中,方便進一步的引用。
提示:加密程式碼,可以找開發要,也可以自己扒原始碼找。
JMeter中更新有加密資料的操作步驟:
- 新增測試計劃。
- 新增執行緒組,設定執行緒組的次數。
- 新增
JDBC Connection Configuration
元件,配置資料庫連線。 - 新增BeanShell 取樣器元件,編寫加密演算法,並把加密的資料儲存到執行緒變數中。
- 新增
JDBC Request
請求,編寫SQL語句,使用引數化,並引用加密的執行緒變數。 - 執行指令碼,傳送SQL請求。
- 新增察看結果樹,檢視結果。
(1)測試計劃內包含的元件
新增元件操作步驟:
- 建立測試計劃。
- 建立執行緒組:
選中“測試計劃”右鍵 —> 新增 —> 執行緒(使用者) —> 執行緒組
。 - 線上程組下,新增配置原件
JDBC連線配置
元件:選中“執行緒組”右鍵 —> 新增 —> 配置元件 —> JDBC Connection Configuration
。 - 線上程組下,新增取樣器
BeanShell 取樣器
元件:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> BeanShell 取樣器
。 - 線上程組下,新增取樣器
JDBC Request
元件:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> JDBC Request
。 - 線上程組下,新增監聽器“察看結果樹”元件:
選中“執行緒組”右鍵 —> 新增 —> 監聽器 —> 察看結果樹
。
最終測試計劃中的元件如下:
點選執行按鈕,會提示你先儲存該指令碼,指令碼儲存完成後會直接自動執行該指令碼。
(2)JDBC連線配置元件內容
基本的JDBC連線配置,介面內容詳解可以看前面的文章【JMeter連線資料庫】。
主要是定義資料庫連線池的名稱,還有最下方關於資料庫的基本資訊配置。
如下圖所示:
(3)BeanShell取樣器介面內容
把生成加密內容的BeanShell程式碼,寫入到介面的指令碼輸入框中。
如下圖所示:
完整程式碼放在下面:
import java.io.PrintStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class PWDEncryptionUtils {
// 靜態方法,類直接呼叫
// 對明文密碼進行加密
public static String encryptPwd(String pwd) {
return stringMD5(pwd);
}
public static String stringMD5(String input) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] inputByteArray = input.getBytes();
messageDigest.update(inputByteArray);
byte[] resultByteArray = messageDigest.digest();
return byteArrayToHex(resultByteArray);
} catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {
localNoSuchAlgorithmException.printStackTrace();
}
return null;
}
public static String byteArrayToHex(byte[] byteArray) {
char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char[] resultCharArray = new char[byteArray.length * 2];
int index = 0;
byte[] arrayofByte = byteArray;
int j = byteArray.length;
for (int i = 0; i < j; i++) {
byte b = arrayofByte[i];
resultCharArray[(index++)] = hexDigits[(b >>> 4 & 0xF)];
resultCharArray[(index++)] = hexDigits[(b & 0xF)];
}
return new String(resultCharArray);
}
// public static void main(String[] args) {
// PWDEncryptionUtils test = new PWDEncryptionUtils();
// String result = test.encryptPwd("12345678");
// System.out.println("result = " + result);
// }
}
//呼叫執行步驟
// 1.建立例項
PWDEncryptionUtils test = new PWDEncryptionUtils();
// 2.呼叫加密函式
String pwd=test.encryptPwd("${__RandomString(8,0123456789,)}");
// 3.儲存資料到JMeter執行緒變數中
vars.put("new_pwd",pwd);
說明一下:
- 這裡主要看最後的三行程式碼,使用函式助手生成的8位數字為資料,進行加密運算。
- 然後存入到JMeter的執行緒變數中,變數名為
new_pwd
。 - 最後,後續的請求中可以引用該變數。
提示:在除錯BeanShell程式碼的時候,可以新增
Debug Sampler
元件來檢視獲取結果。如下圖所示:
(4)JDBC Request元件中內容
填寫應用的資料庫連線池名稱,然後編寫insert
語句,最後加入引數化和加密資料的引用。
我把加密後的資料放在了slogan
欄位中了,如下圖所示:
(5)檢視結果
我把執行緒組中的執行緒數設定為3,也就是執行三次該請求。
結果如下圖所示,執行了三次SQL請求:
我們在去資料庫中檢視資料是否新增成功。
如下圖所示,新增了三條資料,並且slogan
欄位中的資料是經過加密的。
以上就完整的實現了,把經過加密的資料,儲存到資料庫中的演示。
5、注意事項
(1)The server time zone value
伺服器時區異常
如果報錯,如下:
Cannot create PoolableConnectionFactory (The server time zone value '???��������??��??' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.)
解決方法:資料庫連線URL後面加 serverTimezone=GMT
或serverTimezone=GMT%2B8
,即可解決。
(2)執行多條SQL語句
執行多條SQL語句時,查詢語句select
和update
、insert
語句不能在同一個JDBC Request
元件中執行。
當執行多條SQL 語句時,每條語句後面加;
。
並且在 Database URL
後增加一個引數allowMultiQueries=true
,否則將不能夠執行多條語句,報錯。
(3)更新操作中文亂碼
需要在 Database URL
後增加一個引數characterEncoding=utf-8
,這樣就可以解決更新操作時候的中文亂碼了。
提示:一定要設定為UTF-8編碼嗎?不一定,要跟你的資料庫的編碼保持一致,就不會中文亂碼了。
(4)Datebase URL
新增引數規則
Datebase URL
後增加引數,在dbname
後加?
,如有多個引數,每個引數用&
隔開,如:
jdbc:mysql://127.0.0.1:3306/guest?serverTimezone=GMT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true