JdbcRunner 1.3.1リリース(データベース負荷テストツール)

JdbcRunner 1.3.1

JdbcRunner 1.3.1をリリースしました。JdbcRunnerは各種RDBMSを対象としたオープンソースの負荷テストツールです。スクリプトトランザクションを定義して多重実行し、スループットとレスポンスタイムを測定できます。またJdbcRunnerにはOracle Database、MySQLPostgreSQLを対象としたテストキットが付属しており、ユーザーが独自にスクリプトを作成する以外にこれらを用いたベンチマークを行うことも可能です。

dbstudy.info

JdbcRunner 1.3.1では最新環境への追従と細かい不具合修正を行いました。機能追加はありません。

  • 動作要件をJava 8 → Java 17へ変更
  • PostgreSQL JDBC Driverを42.6.0へ更新
  • MySQL Connector/Jを8.0.32へ更新
  • MySQL Connector/J 8.0.27以降でANALYZE文をexecute()で実行できない件に対応

以下のRDBMSで動作を確認しています。

それぞれのRDBMSにおける注意点

久しぶりにツールを動かしてみて、つまづいたところを共有します。

Oracle Databaseのコンテナーイメージを使う場合は-Doracle.net.disableOob=trueを指定する

Oracle Database 19c以降では、クエリーのキャンセルにTCPのURGフラグを使用しています。

参考:第15回 信頼性のある通信を実現するTCPプロトコル(2):基礎から学ぶWindowsネットワーク(2/3 ページ) - @IT

ここで、ルーターやプロキシーによってはURGフラグを正常に処理できずに通信エラーを引き起こすものがあります。残念ながらDocker、Podmanは条件に該当してしまうので、コンテナーイメージを使う場合はツールの起動オプションに-Doracle.net.disableOob=trueを指定してください。

参考:docker-images/FAQ.md at main · oracle/docker-images · GitHub

shell> java -Doracle.net.disableOob=true JR tpcc.js ...

MySQL Connector/J 8.0.27以降ではANALYZE文をquery()で実行する

MySQL Connector/J 8.0.27における不具合修正で、結果セットを返すSQLはexecuteQuery()、結果セットを返さないSQLはexecuteUpdate()で実行するように明確化されました。JdbcRunnerのスクリプトではそれぞれquery()とexecute()に対応しています。

MySQLのANALYZE文は結果セットを返すので、MySQL Connector/J 8.0.27以降ではANALYZE文をexecute()で実行できなくなりました。JdbcRunnerのスクリプトでexecute("ANALYZE TABLE sbtest");という箇所がある場合はquery("ANALYZE TABLE sbtest");への書き換えをお願いいたします。OPTIMIZE文も同様です。ツール付属のテストキットは修正済みです。

PostgreSQLでは極力publicスキーマを使わない

PostgreSQL 15以降ではpublicスキーマに対するCREATE権限がデータベース所有者以外には付与されなくなりました。これはCVE-2018-1058に対処したものです。今後は極力publicスキーマを使わずにデータベースユーザーごとにスキーマを作成することが推奨されます。

参考:A Guide to CVE-2018-1058: Protect Your Search Path - PostgreSQL wiki

shell> psql -U postgres
sql> CREATE DATABASE sbtest TEMPLATE template0 ENCODING 'UTF-8' LC_COLLATE 'C' LC_CTYPE 'C';
sql> CREATE USER sbtest PASSWORD ...;
shell> psql -U postgres sbtest
sql> CREATE SCHEMA AUTHORIZATION sbtest;

今後の予定

JdbcRunnerに機能追加の予定は特にありませんが、今後はJavaのLTSバージョンに追従する形でメンテナンスを続けていければと考えています。