JmeterでJDBCリクエストを投げてみる

# はじめに
ちょっとDBに負荷をかけたくなり、JmeterでJDBCリクエストを投げることにしました。
備忘録として残しますので参考になれば幸いです。

Jmeter初心者ですので、用語は若干誤りがあるかもしれません。

## やりたいこと
- 参照+更新のごく簡単なトランザクションを大量に投げたい
- 操作する行はある程度ランダムに分散させたい

## 前提
DBMSとしてDb2を使用します

# 設定内容
結果的に、以下のエレメントを準備しました。
以下で、各エレメントの設定内容を見ていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/c54f9c74-08c1-7de4-864d-03bfcd09855e.png)

## テスト計画
基本デフォルトのままですが、Db2のJDBCドライバーが格納されているディレクトリをclasspathに追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/74419d29-e4ba-5d87-4ce2-a9b6a48b4273.png)

## スレッドグループ
エレメントの追加方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/2f1cfeef-a270-48b1-201d-3de83844a38d.png)

設定内容
今回は5000秒の間、 100ユーザー×5000トランザクションの負荷をかけることにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/0c67b6db-e204-ed57-3c90-9e6ca351c4b2.png)

## JDBC Connection Configuration
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/504383e9-2807-cd52-3ba9-41c909d1bea9.png)

設定内容
「Variable Name for created pool」は何でもいいですが、後続の「JDBC Request」エレメントで同じ値をセットする必要がある点に注意が必要です。
トランザクションとして実行したいのでAuto CommitはFalseに変更しています。
JDBC driver classはDBMSに則したものを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/6ce9bcab-12d2-4121-656d-af5fdd06cda9.png)

## JDBC Request
実際に投げるJDBCリクエスト(≒ SQL)を定義します。
今回はSELECT + UPDATE + COMMITからなるトランザクションを想定するため3つのエレメントを追加します。

エレメントの追加方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/7a7235bc-bce6-92f5-44fe-09444436fde0.png)

設定内容(SELECT)
「Variable Name of Pool declared in JDBC Connection Configuration」には、「JDBC Connection」で指定したものと同じ。
バラバラな行を更新するため、Where句でパラメータマーカーを使用する。セットする値は後続の「ユーザーパラメータ」エレメントにて定義。
パラメータマーカーを使う参照処理のため、クエリータイプは「Prepared Select Statement」を使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/1f426157-cc8c-8384-dedc-aabd1ca746b9.png)

設定内容(UPDATE)
パラメータマーカーを使う更新処理のため、クエリータイプは「Prepared Update Statement」を使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/455c506f-7f48-c767-b178-58a9e8caefef.png)

設定内容(COMMIT)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/84a1dc52-32dc-9f94-cab9-861417e6391d.png)

## ユーザーパラメータ
スレッド毎に異なるパラメータをセットするために使用しました。(もしかすると、もっといい方法があるかもしれませんが。。。)

エレメントの追加方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/01270b6e-2981-53ba-4414-9fae8bec6948.png)

設定内容
JmeterにはStringFromFileという関数が用意されている。これを使うとファイルからパラメータを順に読み込んで使用してくれるため、スレッド毎に(疑似的に)ランダムなパラメータが使用できる。
ファイルはJmeterのbinフォルダに格納しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/028f7ec8-7b5b-281a-8e91-600a7171882c.png)


(参考)col1Value2.txtファイルの中身
以下のように1から昇順の値を格納した。
実機確認した限りでは、ファイルの最後まで読み込んだら先頭に戻りループする実装になっていると推測。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/5c244013-f0b4-c0c1-a797-f2fb649933e8.png)

## サマリーレポート
実行結果を表示するためのエレメントの一つで、リクエスト総数やスループットのような集計結果を表示できる

エレメントの追加方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/1a1f4895-4c23-d306-7531-1a54d1b96d17.png)
テスト時の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/753e62a9-7a99-930b-7a02-d816db6d1c0c.png)

## View Results Tree
実行結果を表示するためのエレメントの一つで、こちらはリクエスト個々の結果を表示できる。

エレメントの追加方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/7606a4eb-0157-b0c2-8f77-535e525a7ce1.png)

テスト時の結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208552/401456c0-d080-dff5-fe64-6bc877de9b7c.png)