參考博文:
https://www.cnblogs.com/wuzm/p/10862904.html
https://www.cnblogs.com/qmfsun/p/5912532.html
一.環境准備-數據庫壓力測試
a、jmeter5.1.1版本最新版本,可以去網頁下載:https://jmeter.apache.org/download_jmeter.cgi
b、jdbc驅動:
jmeter要鏈接mysql數據庫,首先得下載mysql jdbc驅動包 (注:驅動包的版本一定要與你數據庫的版本匹配,驅動版本低於mysql版本有可能會導致連接失敗報錯)
我這里下載的是 mysql-connector-java-8.0.19.jar
下載地址:https://dev.mysql.com/downloads/connector/j/
准備好驅動包后,按照如圖進行設置:
點擊測試計划-->點擊瀏覽-->選中mysql驅動jar包-->打開
c、在測試計划下,把JDBC驅動包添加上,也可以將驅動包放入jmeter的lib目錄下,即可自動加載。
二.操作步驟
新建一個線程組→添加配置元件---JDBC Connection Configuration(連接數據庫組件)→
添加取樣器→JDBC Request(JDBC請求)
JMeter如果進行JDBC請求,
請求后的響應結果如何給下一個請求用(也就是傳說中的關聯)
1.添加 "JDBC Connection Configuration"里面用來配置一些數據庫連接的信息
JDBC Connection設置創建數據庫連接(供JDBC Request Sampler使用)
1) Variable Name Bound to Pool:數據庫連接池的變量名。 需要唯一標識。與JDBC取樣器中的相對應,決定JDBC取樣的配置。
原理:JDBC request可以通過選擇不同的連接池名來選擇不同的數據庫連接。
VariableName變量名稱:與JDBC Request的Variable name保持一致,因為鏈接數據庫是需 要在JDBC Connection Configuration中配置好的,
然后賦予一個變量名稱,那么JDBCRequest想要去訪問數據庫,就必須通過這個配置好的元件去連接,
所以JDBCReques就需要通過讀取JDBC Connection Configuration的變量中的信息。
Variable Name:連接池綁定的jmeter變量的名稱,自定義填寫,必須與JDBC連接配置的“變量名稱”字段一致。
比如JDBC Connection Configuration里面的Variable Name是jdbc_config
那么在寫JDBC請求時,需要填寫的Variable Name就必須是jdbc_config!!!
Validation Query:驗證查詢,不同版本的填寫格式可能不同(比如3.1是Select 1,2.6是Select1),格式錯誤會報錯。最新的Jmeter5.1.1下拉框可選擇。
2 ) Connection Pool Configuration 連接池配置參數如下
a. Max Number of Connections: 該數據庫連接池的最大連接數,一般可設置為0,意思是每個線程都使用單獨的數據庫連接,線程之間數據庫連接不共享,在大多數情況下,將其設置為0,這意味着每個線程將得到它自己的池,其中只有一個連接,即線程之間不共享連接。如果您真的想要使用共享池(為什么?),那么將max count與線程數相同,以確保線程不會相互等待。
b. Max Wait(ms)}: 在連接池中取回連接最大等待時間,在查詢過程中, 超過設置的值,連接池會拋出錯誤
c. Time Between Eviction Runs (ms)疏散時間,數據庫空閑清理的間隔時間
d. Auto Commit自動提交。有三個選項,true、 false、編輯(自己通過imeter提供的函數設置)
Transaction lsolation:
事務間隔級別設置,主要有如下幾個選項:
[TRANSACTION NODE]事務節點
TRANSACTION READ UNCOMMITTED事務未提交讀
TRANSACTION READ COMMITTED事務已提交讀
TRANSACTION SERIALIZABLE事務序列化
DEFAULT默認
TRANSACTION REPEATABLE READ事務重復讀
3) Connection Validation by Pool
這是Jmeter用來檢驗數據庫連接是否有效的一種機制,超過5秒沒有使用的話,就會用validation query去測試下這個連接是否有效
1、Test While ldle 當空閑的時候測試連接是否斷開,測試連接池的空閑連接,驗證查詢將會被使用去測試。
2、Soft Min Evictable Idle Time(ms) :最少的時間連接可能在池中閑置,然后才有資格被閑置的對象驅逐出去,額外的條件是至少在池中保持連接。默認值為5000(5秒)
4)Database Connection Configuration
a. Database URL:數據庫服務器地址。如jdbc:mysql://localhost:3306/test 表示本地數據庫,3306端口,數據庫名稱為test
如果想執行多條語句可以使用(allowMutiQueries-true表示在JDBC中執行多條Selec語句)
可配置如下:
jdbc:mysql://ip:3306/數據庫名?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
jdbc:mysql://{ip}:{port}/{dbname}?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
useUnicode=true 使用Unicode編碼格式(字符集編碼格式)
characterEncoding=utf8 使用UTF-8解碼(字符集編碼格式)
allowMultiQueries=true 允許多個query一起使用(1個請求中添加多個sql語句)
b. JDBCDriver Class:據庫IDBC驅動類 名i com.mysaLjdbc.Driver.3、Username:數據庫用戶名root
c. password: 數據庫密碼(注意,是明文)
請求中執行多條sql的關鍵兩步
1. 【JDBC Connection Configuration 】在配量DataBase URL的時候,加上allowMultiQueries-true參數如:jdbc:mysq://192 168 0.183:3306/mysql?allowMultiQueries=utrue
2. 【JDBC Request】 在jdbc請中, QueryType一定要選擇Callable statement,使用Callablestatement時, 一次可以包含多個SQL,但非結尾的SQL要加“;”
2.添加一個“CSV Data Set Config”,用來在后續的JDBC請求中select語句中where條件參數化使用
user_ids這個字段我們將使用參數化,參數化的值也是從數據庫中拷貝出來的
這樣使用查詢語句的話才會成功。
3.添加JDBC請求
Query Type:
上面這里如果不是很清晰的話,可以參考
https://www.cnblogs.com/yiyaxuan/p/12367848.html 這里我分別舉例子實際操作附有截圖。
4.請求測試可以發現jdbc請求已經成果,並能在響應數據中看到返回的結果
5.那么接下來的問題就來了,如果我的下一個請求,需要JDBC中的請求,那我該怎么得到JDBC中的響應數據呢?
在JMETER中可以使用“正則表達式提取 器”來實現,那么怎么來實現呢,需要在jdbc請求后面添加一個后置的“正則表達式提取器”(表達式中的關鍵部分是 ([^"]+) ),添加的表達式如下
6.為了驗證是否能正確取得jdbc中的響應結果數據,模擬添加了一個簡單的http請求
7.http請求的“查看結果樹”中可以看到成功的取得的user_id的信息
多說幾句,如果SQL語句寫成 select 'user_id='|| '"' || user_id ||'"' from sys_user b where b.USER_ID='13707'的形式,則可以通過下面的正則表達式來取到user_id=后面的內容,正則表達式為:user_id=" (.+?)"
配置完畢,接下來填寫JDBC請求
Variable Name:與JDBC Connection Configuration中的Variable Name保持一致
Query Type:語句類型,查詢用select,增刪改用update,一起用可以選擇callable
Query:填寫對應的語句(這里用了一個簡單的查詢語句作為示例)