[Oracle] JDBCRunnerでデータベース負荷テスト

* ベンチマークツールの「[JdbcRunner - 汎用データベース負荷テストツール](https://dbstudy.info/jdbcrunner/docs_ja/index.html)」を使ってOracle Databaseの負荷テストを行います。
* データベースはOracle Cloud InfrastructureのVMを利用しています。
* テストシナリオとしては、「[10. テストキット Tiny TPC-C](https://dbstudy.info/jdbcrunner/docs_ja/tpc-c.html)（卸売業における注文・支払いなどの業務をモデルにしたトランザクション, ）」を使用しています。

# 実行環境
※Oracle Cloud InfrastructureのVMを利用しています。

* OS: Linux
* Oracle Database システムバージョン:19.7.0.0.0
* JdbcRunnerバージョン: 1.3

# 各種ツールのインストール

「Java」「Oracle用JDBCドライバ(jar)」「JDBCRunnerツール(jarとjs実行スクリプト)」が必要です。

### Javaインストール

```terminal
[opc@dbcs2 ~]$ sudo yum install java-1.8.0-openjdk
```

### フォルダに権限付与
※テスト環境であるため、ユーザディレクトリを使用しています。

```terminal
[opc@dbcs2 ~]$ sudo chmod 644 /home/oracle
```

### Javaツールインストール
Jarファイルを配備し、CLASSPASSにパスを通します。


#### JDBCRuner
[JdbcRunnerの詳細情報 : Vector ソフトを探す！](https://www.vector.co.jp/soft/other/java/se481080.html) から「jdbcrunner-1.3.jar」をダウンロードし、「/home/oracle/」に配備

#### Oracle Database用のJDBCドライバ
[Oracle JDBC and UCP 19c Download page](https://www.oracle.com/database/technologies/appdev/jdbc-ucp-19c-downloads.html) から「ojdbc10.jar」をダウンロードし、「/home/oracle/」に配備。



#### CLASSPATH設定

```terminal
set CLASSPATH=jdbcrunner-1.3.jar:ojdbc10.jar:ucp.jar

以下のようになっていれば完了
[oracle@dbcs2 ~]$ env | grep CLASSPATH
CLASSPATH=jdbcrunner-1.3.jar:ojdbc10.jar:ucp.jar
```


# テストデータ作成

### ユーザ作成

```terminal
OSユーザ切替
[opc@dbcs2 ~]$ sudo su - oracle

データベース接続
[oracle@dbcs2 ~]$ sqlplus / as sysdba

データベースユーザ作成
SQL> CREATE USER tpcb IDENTIFIED BY tpcb;
SQL> GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE TO tpcb;

```

### テーブル作成
「tpcb_load.js」を「/home/oracle」に配備して、内容を修正


```tpcb_load.js

// ※Oracle Database以外のjdbcUrlはコメントアウトしてjdbcUrlを設定
// Oracle Database
var jdbcUrl = "jdbc:oracle:thin:@//サーバのパブリックIPアドレス:1521/サービス名";
// サービス名は「$ORACLE_HOME/network/admin/tnsnames.ora」に記載されている。

var jdbcPass = "自分で決めたtpcbユーザのパスワードに変更";
var jdbcDriver = "oracle.jdbc.driver.OracleDriver";

```
### スクリプト実行

テストデータ作成用のスクリプトを実行します。

```
[oracle@dbcs2 ~]$ java JR tpcb_load.js
```

# 負荷テスト実行

「/home/oracle」に「tpcb.js」を配備して「tpcb_load.js」と同様に修正。
以下のコマンドで実行。


```
[oracle@dbcs2 ~]$ java JR tpcb.js

：
：
22:42:39 [INFO ] [Progress] 62 sec, 710 tps, 49326 tx
22:42:40 [INFO ] [Progress] 63 sec, 732 tps, 50058 tx
22:42:41 [INFO ] [Progress] 64 sec, 682 tps, 50740 tx
22:42:42 [INFO ] [Progress] 65 sec, 711 tps, 51451 tx
22:42:43 [INFO ] [Progress] 66 sec, 771 tps, 52222 tx
22:42:44 [INFO ] [Progress] 67 sec, 678 tps, 52900 tx
22:42:45 [INFO ] [Progress] 68 sec, 752 tps, 53652 tx
22:42:46 [INFO ] [Progress] 69 sec, 669 tps, 54321 tx
22:42:47 [INFO ] [Progress] 70 sec, 744 tps, 55065 tx
22:42:48 [INFO ] [Progress] 71 sec, 791 tps, 55856 tx
22:42:49 [INFO ] [Progress] 72 sec, 756 tps, 56612 tx
：
：
22:44:37 [INFO ] [Total tx count] 141818 tx
22:44:37 [INFO ] [Throughput] 787.9 tps
22:44:37 [INFO ] [Response time (minimum)] 4 msec
22:44:37 [INFO ] [Response time (50%tile)] 15 msec
22:44:37 [INFO ] [Response time (90%tile)] 34 msec
22:44:37 [INFO ] [Response time (95%tile)] 47 msec
22:44:37 [INFO ] [Response time (99%tile)] 85 msec
22:44:37 [INFO ] [Response time (maximum)] 354 msec
22:44:37 [INFO ] < JdbcRunner SUCCESS
```

# 参考サイト

Java

* [Installing OpenJDK 8 on RHEL-based Systems | Installing the JDK](https://docs.datastax.com/en/jdk-install/doc/jdk-install/installOpenJdkRHEL.html)

Oracle Database

* [Oracle DatabaseでのJavaの使用](https://docs.oracle.com/cd/E16338_01/appdev.112/b56268/introduction.htm#CACBFIIC)
* [データソースおよびURL](https://docs.oracle.com/cd/E96517_01/jjdbc/data-sources-and-URLs.html#GUID-EF07727C-50AB-4DCE-8EDC-57F0927FF61A)

JDBC

* [JDBC - Database Connections - Tutorialspoint](https://www.tutorialspoint.com/jdbc/jdbc-db-connections.htm)
* [java - Cannot create PoolableConnectionFactory (Io exception: The Network Adapter could not establish the connection) - Stack Overflow](https://stackoverflow.com/questions/9257537/cannot-create-poolableconnectionfactory-io-exception-the-network-adapter-could/62610073#62610073)
* [How to fix: "No suitable driver found for jdbc:mysql://localhost/dbname" error when using pools? - Stack Overflow](https://stackoverflow.com/Questions/5556664/how-to-fix-no-suitable-driver-found-for-jdbcmysql-localhost-dbname-error-w)

JDBCRuner

* [jdbcRunnerを使ってDatabaseの性能評価しちゃったシリーズ①jdbcRunnerのインストール設定方法 編 | クラウド工房 Powered by Amazon Web Services](https://www.cloud-koubou.jp/archives/1927)


## おまけ（自作スクリプト）

SQL

```sql
create table sample(
  id number GENERATED by default on null as IDENTITY,
  charcol1 varchar2(4000)
);
```
シェルスクリプト

```shell

#!/bin/bash
(
  for ((i=0;i<2000;i++)); do
    echo -e "SELECT count(*) FROM sample;\n"
    echo -e "insert into sample(charcol1) values ('mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRDGXM9ZLzkdekbWtmXKwZ2qG1llkRw5m9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw1KQ1lT4zg9rdxBL');\n"
    echo -e "commit;\n"
    sleep 1
  done
  echo "exit"
) | sqlplus / as sysdba
exit $?
```

【参考】
* [Oracle：接続1回でSQLを繰り返し実行するシェルスクリプト | けしくんのWebLog](https://ameblo.jp/keshi0414/entry-12280491909.html)
* [Shellでsqlplusを使ってSQLを実行する方法 | エンジニアへの道](https://www.flyenginer.com/low/low_shell/shell%E3%81%A7sqlplus%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6sql%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html)