PAMで利用するDBを変更する方法（PostgreSQLの場合）

Red Hat Process Automation Manager (PAM) は、デフォルトでは、H2DBを使うことができるようになっています。
H2DBは、Javaで実装された、軽量なインメモリデータベースですが、本番で使うことは推奨されていません。

本格的な開発に入る前に、DBを変更しましょう。

以下のDB用のDDLスクリプトがダウンロード可能になっています。

- DB2
- H2
- MySQL
- Oracle
- PostgreSQL
- SQLServer
- Sybase

### 大まかな流れ
PAMがEAP上にデプロイされ、正常起動する状態を前提とします。ローカルへの環境構築方法は以下記事等を参照ください。
[PAMの開発環境をローカルで作成して触ってみるための手順](https://qiita.com/Erina/items/2b80ecab78d6378417fc)

1. 必要なものをダウンロード（DDLスクリプト、JDBCドライバ、なければDB本体も）
2. DBをインストール
2. DDLスクリプトを流す
2. JDBCドライバをEAPにモジュール登録
3. PAMのデフォルトDB設定を変更

# ここでの前提
DBはPostgerSQLを使います（バージョンは13.1）

# 必要なもの
- DB本体
    - 各自入手ください。PostgreSQLはこのあたりからダウンロード [https://www.postgresql.jp/download](https://www.postgresql.jp/download)
    - macの場合、Homebrewでインストール可（バージョン13の場合の例）

``` 
$ brew install postgresql@13
```
- DDLスクリプト（以下の製品のadd-onのzip内に各DB用のDDLスクリプトが含まれています）
    - [https://developers.redhat.com/download-manager/file/rhpam-7.8.0-add-ons.zip](https://developers.redhat.com/download-manager/file/rhpam-7.8.0-add-ons.zip)
- JDBCドライバ
    - 各自入手ください。postgresql用はこのあたりなど。
[https://jdbc.postgresql.org/download.html](https://jdbc.postgresql.org/download.html)
- DB用GUIツール（pgadmin,Object Browser等、無くてもよいが、あったほうが便利）
    - ここではpgadmin使いました。pgadminはこちらからダウンロード [https://www.pgadmin.org/download/](https://www.pgadmin.org/download/)


### 手順を詳細解説

**DB本体のインストール方法、pgadminのインストール方法は、ここでは省略します。

#### DDLスクリプトを流す

DDLスクリプトが含まれている、add-ons.zipを解凍すると、複数のzipが出来ます。その中の「rhpam-7.x.x-migration-tool.zip」を更に解凍します。
すると、ddl-scriptsフォルダが出来ます。そこに各DB用のDDLスクリプトがあります。
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276989/6e9b3f6c-0e99-117b-982c-49f4fb2d35c7.png)

たくさんありますが、新規作成時に必要なのは、postgresql-jbpm-schema.sql です。

DBをインストールして起動したら、ユーザを作りましょう。（まだやっていない場合）
以下はmacの場合の例

```
// PostgreSQLインストール
$ brew install postgresql
//  バージョン確認
$ psql --version
// postgresql起動
$ brew services start postgresql
// ユーザ作成
$ createuser -s -P ユーザ名
```

まず、PAM用のデータベースを作成します。

```
$ createdb DATABASE_NAME
```
（もしくは、psqlで接続して、# create database DATABASE_NAME）

次に、DDLスクリプトを流します。

```
$ psql DATABASE_NAME < /解凍したDDLスクリプトのパス/postgresql-jbpm-schema.sql 
```

各種テーブル（40数個）とインデックス等が生成されます。
これで、PAM用のデータベースが完成です。

pgadmin等でアクセスして、中身（データは空です）を確認してみましょう。
バージョン7.9では、以下のテーブルが作成されました。
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276989/4138ba0d-4421-0768-868e-14567d8e5180.png)

テーブルたくさんありますが、よく使われるものは一部のみです。
どういうデータが入るかは、テーブル名からなんとなく想像できると思います。

#### JDBCドライバをEAPにモジュール登録する
次に、JDBCドライバをEAPに登録します。
ここでは、CLIを使うやり方を紹介します。（管理コンソールからも可能です）

CLIツールは、`/EAP_HOME/bin/jboss-cli.sh` です。

```
$ ./EAP_HOME/bin/jboss-cli.sh
```
CLIを起動後、以下のmodule addコマンドを実行し、モジュールを追加します。

```
module add --name=MODULE_NAME --resources=PATH_TO_JDBC_JAR --dependencies=DEPENDENCIES
```
```
// 以下は例
module add --name=org.postgresql --resources=/path/postgresql-42.2.18.jar --dependencies=javax.api,javax.transaction.api
```

続いて、同じくCLIで以下コマンドを実行し、JDBCドライバを登録します。

```
/subsystem=datasources/jdbc-driver=DRIVER_NAME:add(driver-name=DRIVER_NAME,driver-module-name=MODULE_NAME,driver-xa-datasource-class-name=XA_DATASOURCE_CLASS_NAME, driver-class-name=DRIVER_CLASS_NAME)
```

```
// 以下は例
/subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=org.postgresql,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource))
```
driver-module-nameとmodule addした際のnameを一致させます。


さて、次に、データソースを作成します。
CLIでデータソースを作成します。non-XAとXAとがあります。ここでは、non-XAデータソースを作成します。
PAMと連携するアプリケーション側のDBが他のところにあり、2フェーズコミットが必要になる場合は、XAデータソースを作成します。

```
data-source add --name=DATASOURCE_NAME --jndi-name=JNDI_NAME --driver-name=DRIVER_NAME  --connection-url=CONNECTION_URL
```
```
// 以下は例
data-source add --name=PostgresDS --jndi-name=java:jboss/PostgresDS --driver-name=postgresql --connection-url=jdbc:postgresql://localhost:5432/postgresdb --user-name=admin --password=admin 
```


#### PAMのデフォルトDB設定を変更する

最後に、PAMのデフォルトDBが、H2DBになっているので、それを変更します。
`/EAP_HOME/standalone/configuration/standalone-full.xml`を編集します。

system-propertiesの設定箇所で、以下のプロパティを探し、valueを以下のように編集します。
以下プロパティがない場合は、追加します。
- org.kie.server.persistence.ds
- org.kie.server.persistence.dialect

```xml:standalone-full.xml
<system-properties>
・・・
        <property name="org.kie.server.persistence.ds" value="java:jboss/PostgresDS"/>
        <property name="org.kie.server.persistence.dialect" value="org.hibernate.dialect.PostgreSQL82Dialect"/>
・・・
</system-properties>
```

EAP再起動で、PostgreSQLがデフォルトDBになります。