做網(wǎng)站實現(xiàn)登陸功能2023年12月疫情又開始了嗎
![]() | 博主歷時三年精心創(chuàng)作的《大數(shù)據(jù)平臺架構與原型實現(xiàn):數(shù)據(jù)中臺建設實戰(zhàn)》一書現(xiàn)已由知名IT圖書品牌電子工業(yè)出版社博文視點出版發(fā)行,點擊《重磅推薦:建大數(shù)據(jù)平臺太難了!給我發(fā)個工程原型吧!》了解圖書詳情,京東購書鏈接:https://item.jd.com/12677623.html,掃描左側二維碼進入京東手機購書頁面。 |
文章目錄
- 1. 下載與安裝
- 2. 創(chuàng)建 Test Plan
- 3. 創(chuàng)建 Thread Group
- 4. 添加 MySQL JDBC Connection 配置
- 4. 添加 JDBC Request Sampler
- 5. 添加 View Results Tree
- 6. 執(zhí)行測試計劃
- 7. 已知錯誤
- 8. 附錄
數(shù)據(jù)庫的壓測工具和方法有很多,最簡單的方法無非是編寫腳本自動執(zhí)行 INSERT INTO 語句,也有專門的 GUI 工具可以圖形化配置測試計劃,例如:Data Generator for MySQL 和 EMS Data Generator for MySQL 等,不過,絕大多數(shù)的圖形化工具都是付費的。
實際上,對數(shù)據(jù)庫的壓測,也包括其他類型的壓測,最主要的工作是:如何能簡單地生成壓測數(shù)據(jù)(Dummy Data),除了要生成與數(shù)據(jù)類型相符的字面量之外,更多的是要能控制好數(shù)據(jù)的取值范圍,特別地,在數(shù)據(jù)庫的壓測中,受外鍵約束的影響,對于外鍵列的取值更不能使用隨機值。
考慮到寫腳本太麻煩,圖形化工具收費還不通用,所以,我們還是選擇使用老牌的壓力測試工具:Apache JMeter,除了它內置了豐富的隨機值生成方法外,還因為它是一個統(tǒng)一的壓測平臺,操作和配置都和其他類型的壓測一致。
備注:本文以 Debezium 官方提供的 MySQL Docker鏡像 中的 Inventory 數(shù)據(jù)庫為示例介紹和演示壓測步驟。
1. 下載與安裝
JMeter 官方下載: https://jmeter.apache.org/download_jmeter.cgi
提示:在 Windows 下,請運行 ${JMETER_HOME}/bin/jmeterw.cmd
(運行 jmeter.bat 會多打開一個 console 窗口)
MySQL JDBC Driver 官方下載:https://dev.mysql.com/downloads/connector/j/
解壓 zip 包獲得里面的 jar 包,將 jar 包放置到 ${JMETER_HOME}/lib
目錄下
2. 創(chuàng)建 Test Plan
打開 JMeter 時,默認會自動創(chuàng)建一個空的 Test Plan,我們將其重命名為:Debezium MySQL Example Ddatabase Test Plan
3. 創(chuàng)建 Thread Group
在剛創(chuàng)建的 Test Plan 上單擊右鍵打開菜單,添加一個 Thread Group,其中 Number of Threads (users) 是并行的線程數(shù),Loop Count 是重復執(zhí)行的次數(shù),假設我們的壓測內容是插入一條數(shù)據(jù),則執(zhí)行一次 Thread Group 插入的記錄數(shù)是兩者的乘積。本例中,該測試計劃將會插入 2 * 50 = 100 記錄。
4. 添加 MySQL JDBC Connection 配置
為使 JMeter 能聯(lián)通 MySQL 數(shù)據(jù)庫,測試計劃的第一步就是創(chuàng)建 JDBC 連接的配置。在剛創(chuàng)建的 Test Group 上單擊右鍵打開菜單,添加一個 JDBC Connection Configrutation,這里有兩點需要注意:
- JMeter 要求 JDBC 的 URL 必須指定數(shù)據(jù)庫名,否則執(zhí)行時會報錯
- 必須配置 Variable Name for created pool,否則執(zhí)行時會報錯
4. 添加 JDBC Request Sampler
JMeter 負責向數(shù)據(jù)庫發(fā)送 SQL 的組件是:JDBC Request Sampler,所以我們要創(chuàng)建一個 JDBC Request Sampler 并填入相應的 SQL 語句,在剛創(chuàng)建的 Test Group 上單擊右鍵打開菜單,添加一個 JDBC Request:
在這里,Query Typle 選擇 Upate Statement (這是 JDBC 中的 API),填入的 SQL 是整個測試計劃中最核心的部分,所有的動態(tài)變量、取值范圍等細節(jié),都通過這條 SQL 實現(xiàn)了,因為我們使用了 JMeter 的函數(shù)和變量來生成期望的數(shù)值!
INSERT INTO `orders` (`order_date`, `purchaser`, `quantity`, `product_id`)
VALUES('${__RandomDate(,2016-01-01,2016-12-31,,)}', ${__Random(1001,1004)}, ${__Random(1,9)}, ${__Random(101,109)})
關于${__RandomDate(,2016-01-01,2016-12-31,,)}
和 ${__Random(1001,1004)}
這些 JMeter 的函數(shù),請移步 JMeter 官方文檔:https://jmeter.apache.org/usermanual/functions.html ,這里有細致地解釋。
5. 添加 View Results Tree
View Results Tree 是用來查看執(zhí)行結果的,在配置或執(zhí)行過程中出錯的話,可以在這里看到發(fā)送的請求和詳細錯誤,是很有必要配置的一個組件。在剛創(chuàng)建的 Test Group 上單擊右鍵打開菜單,添加一個 View Results Tree 即可,無需特別配置。
6. 執(zhí)行測試計劃
完成上述配置后,就可以執(zhí)行測試計劃了,點擊工具欄中的 “綠色開始按鈕”,等待測試計劃執(zhí)行完畢,然后打開 View Results Tree 可以看到每次測試的詳細情況,包括是否執(zhí)行成功、發(fā)送的請求內容和得到的響應。如果初始嘗試沒有成功,可以在這里找到詳細的錯誤信息,從而幫助定位問題并解決。
7. 已知錯誤
1. Name for DataSoure must not be empty in JDBC Connection Configuration
執(zhí)行測試計劃時,JMeter 報錯:
java.lang.IllegalArgumentException: Name for DataSoure must not be empty in JDBC Connection Configurationat org.apache.jmeter.protocol.jdbc.config.DataSourceElement.testStarted(DataSourceElement.java:119) ~[ApacheJMeter_jdbc.jar:5.6.3]at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfStart(StandardJMeterEngine.java:247) [ApacheJMeter_core.jar:5.6.3]at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:432) [ApacheJMeter_core.jar:5.6.3]at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?]at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]at java.base/java.lang.Thread.run(Thread.java:833) [?:?]
原因:JDBC Connection Configuration 和 JDBC Request 中沒有配置 pool 的變量名,或者配置了,但取名不一樣,改為相同的變量名即可:
8. 附錄
以下是本文使用的 Debezium 官方提供的 MySQL Docker鏡像 中的 Inventory 數(shù)據(jù)庫的 orders 數(shù)據(jù)表的表結構:
-- Dumping structure for table inventory.orders
DROP TABLE IF EXISTS `orders`;
CREATE TABLE IF NOT EXISTS `orders` (`order_number` int(11) NOT NULL AUTO_INCREMENT,`order_date` date NOT NULL,`purchaser` int(11) NOT NULL,`quantity` int(11) NOT NULL,`product_id` int(11) NOT NULL,PRIMARY KEY (`order_number`),KEY `order_customer` (`purchaser`),KEY `ordered_product` (`product_id`),CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`purchaser`) REFERENCES `customers` (`id`),CONSTRAINT `orders_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10008 DEFAULT CHARSET=latin1;-- Dumping data for table inventory.orders: ~5 rows (approximately)
INSERT INTO `orders` (`order_number`, `order_date`, `purchaser`, `quantity`, `product_id`) VALUES(10001, '2016-01-16', 1002, 5, 104),(10002, '2016-01-17', 1002, 2, 105),(10003, '2016-02-25', 1002, 2, 106),(10006, '2016-02-29', 1002, 2, 106),(10007, '2016-02-28', 1001, 2, 106);