DBへの接続
wisdomでDBへアクセスするための設定情報、設定方法の説明です。

- DB接続情報の編集 wisdom_config.xml
- IRequestHandlerを使用したDBへの接続
- IBatchHandlerを使用したDBへの接続
- DBへの接続保持と重複Connection取得の回避
- 例外発生時のコミット、ロールバック、クローズ処理
- 各ステートメント資源の自動クローズ
- SQLログの出力

DB接続情報の編集 wisdom_config.xml
wisdom_config.xmlの編集
アプリケーションからDBへ接続するためには、wisdom_config.xmlへの設定が必要です。
例） wisdom_config.xmlのDB設定情報
<datasource id='dbid' default='true'>
<parameter id='db.dsname' value='was_ds'/>
<parameter id='db.user' value='db2inst1'/>
<parameter id='db.password' value='db2inst1'/>
<parameter id='db.name' value='sample'/>
<parameter id='db.ds.class' value='wisdom.core.datasource.NativeDB2'/>
<parameter id='sql.stmt.auto.close' value='true'/>
<parameter id='sql.stmt.trace' value='false'/>
</datasource>
要素　<datasource id='dbid' default='true'>
wisdom上のDB接続情報の1単位です。wisdom_config.xmlには複数のDB設定をすることができます。属性「id」にDB接続のIDを指定します。このIDの値はwisdom_config.xmlの中で1意にします。属性「default」にはtrue、falseの値を指定します。この値がtrueに設定してあるDB情報が省略時のDB接続になります。アプリケーションからは以下の2通りの方法でDBへ接続します。
例 ）アプリケーションからのDBへの接続のコード
/* コード- 1 　DB設定のIDの指定なしでDBへ接続を行う例（引数でIDを指定しないと、省略時の設定への接続になります。）　*/
Connection c = rh.getConnection();
/* コード- 2 　DB設定のIDの指定つきでDBへ接続を行う例　*/
Connection c = rh.getConnection("dbid");
上の例中の「コード -1 」では、要素「datasource」の属性「default」がtrueになっているDB設定情報を使用してDBへ接続を行います。
上の例中の「コード -2 」では、要素「datasource」の属性「id」が"dbid"になっているDB設定情報を使用してDBへ接続を行います。
要素　<parameter> に設定する値

No | id | valueに設定 |  | 備　考
--- | --- | --- | --- | ---
1 | db.dsname | 任意の値 | データソース接続を行う場合に、アプリケーション・サーバー側に設定したデータソースの名前 | アプリケーションサーバー上でJNDIへLookupを行いますが、そのときには"jdbc"を補填しJNDIへのLookupを行います。上の例では"jdbc/was_ds"でLookupを行います。 ※この値はデータソース接続を行わない場合不要です。
2 | db.user | 任意の値 | データソース接続を行わない場合の、DB認証のユーザーID | DB認証で使用するユーザーIDを指定します。 ※この値はデータソース接続を行う場合は不要です。
3 | db.password | 任意の値 | データソース接続を行わない場合の、DB認証のパスワード | DB認証で使用するパスワードを指定します。 ※この値はデータソース接続を行う場合は不要です。
4 | db.name | 任意の値 | データソース接続を行わない場合の、DB名 | DB名を指定します。 ※この値はデータソース接続を行う場合は不要です。
5 | db.ds.class | ※ | データベース接続に使用するクラス名 | ※下記「DB接続で使用できるクラス」を参照してください。
6 | sql.stmt.auto.close | true|false | 自動クローズを使用する場合true | trueの場合、コネクションのクローズ時にアプリケーションで使用したSQL資源を検査しクローズされていない場合はクローズを行います。 ※この設定は常にtrueにしてください。
7 | sql.stmt.trace | true|false | SQLのトレースを出力する場合true | trueの場合、アプリケーションで実行したSQLの処理がすべてログ出力されます。このログは開発中のデバッグ処理に利用できます。 ※ログ出力はパフォーマンスに大きな影響を与えます。システム稼動時にはfalseにしてください。

DB接続で使用できるクラス
パッケージ　wisdom.core.datasource

No | クラス名 | 接続DBタイプ | 接続プール | 使用JDBCドライバー | URL接頭子
--- | --- | --- | --- | --- | ---
1 | NativeDB2 | DB2 UDB | × | COM.ibm.db2.jdbc.app.DB2Driver | jdbc:db2:
2 | PooledDB2WAS35x | ※環境依存 | ○ | ※環境依存 | ※環境依存
3 | PooledDB2WAS4x | ※環境依存 | ○ | ※環境依存 | ※環境依存
4 | NativeUDB400 | UDB/400 | × | com.ibm.db2.jdbc.app.DB2Driver | jdbc:db2:
5 | ToolboxUDB400 | UDB/400 | × | com.ibm.as400.access.AS400JDBCDriver | jdbc:as400:
6 | NativeOracle | Oracle | × | oracle.jdbc.driver.OracleDriver | jdbc:oracle:

wisdom_config.xmlのDB接続情報の「db.ds.class」には以下のクラス名が指定できます。各接続クラスが使用しているJDBCドライバーは実行時の環境でクラスパスなどで参照できる必要があります。
IRequestHanlderを使用したDBへの接続
AbstractRequestCommandを継承したWebアプリケーションからはIRequestHandlerを使用してDB接続を行います。
例）　IRequestHandlerを使用したDBへの接続
Connection c = rh.getConnection();
IBatchHanlderを使用したDBへの接続
AbstractBatchCommandを継承したバッチアプリケーションからはIBatchHandlerを使用してDB接続を行います。
例）　IBatchHandlerを使用したDBへの接続
Connection c = bh.getConnection();
DBへの接続保持と重複Connection取得の回避
IRequestHandler、IBatchHandlerともにDBへの接続はAbstractRequestCommand、AbstractBatchCommandの終了まで保持されます。
またDBへの接続はwisdom_config.xmlに設定した要素「datasource」の属性「id」に設定した値で判別されます。
例）　IRequestHandlerを使用した複数回のDBへの接続
Connection c1 = rh.getConnection();
Connection c2 = rh.getConnection();
上の例ではrh.getConnection()を複数回行っていますが、実際にDBに接続し、java.sql.Connectionオブジェクトが作成されるのは最初の1回目になります。上の例では、c1とc2のインスタンスは同一のオブジェクトになります。
IRqeustHandler、IBatchHandlerは取得したjavax.sql.Connectionオブジェクトをそのアプリケーションの終了まで保持します。判別にはdatasourceのidの値を使用します。下のwisdom_config.xmlの例を見てみます。
datasource id='dbid1' default='true'>
・・・DB1の設定情報
</datasource>
datasource id='dbid2' default='false'>
・・・DB2の設定情報
</datasource>
例）　IRequestHandlerを使用した複数回のDBへの接続
Connection c1 = rh.getConnection();
Connection c2 = rh.getConnection("dbid1");
上の例ではwidom_config.xmlのdatasource、dbid1は省略時設定となっており、dbid1という名前が付けられています。上の2つのメソッドは同じConnectionオブジェクトを取得します。
例）　IRequestHandlerを使用した複数のDBへの接続
Connection c1 = rh.getConnection();
Connection c2 = rh.getConnection("dbid2");
上の例ではc1はwidom_config.xmlの省略時設定として指定されたdatasource、dbid1を取得します。c2はdatasource、dbid2への接続を行います。
※java.sql.Connectionオブジェクト取得の制限はidによって行われていることに注意してください。仮にidの値だけが違うまったく同じDB接続の情報を設定しそれぞれのConnectionを取得した場合、トランザクションが別になります。
例外発生時のコミット、ロールバック、クローズ処理
処理行っている最中に例外が発生した場合、すべての資源はロールバックが行われ、クローズ処理を行い、正常に終了した場合、コミット、クローズ処理をwisdom側で行います。
wisdomでは、IRequstCommand、IBatchCommandを1つのトランザクションの単位として捕らえ、各コマンド処理後（例外が発生した場合はそのとき）に正確にトランザクションを終了します。
※アプリケーションでは、java.sql.Connectionへのコミット、ロールバック、クローズ処理（try/catch制御）は行わないでください。
Connection以外のStatement、PreparedStatement、ResultSetオブジェクトへのクローズもwisdom側でコマンド単位のトランザクション終了時に正しくクローズ処理が行われているかを検査し、クローズされていない場合クローズしますが、これらのオブジェクトに対してはアプリケーションで明示的にクローズ処理を行ってください。これは「しなくてもよい」というコーディングが定着するのを防ぐためです。
各ステートメントの自動クローズ
<parameter id='sql.stmt.auto.close' value='true'/>
wisdomでは、java.sql.Connectionオブジェクトから取得されたオブジェクト、Statement、PreparedStatement、ResultSetオブジェクトがクローズされているか検査を行い、クローズされていない場合、警告メッセージを表示し、クローズを試みます。
※この設定はシステム稼動時に例外が発生した場合に使用した各ステートメントをクローズするためにもつねにtrueにしてください。
例）wisdom内でのStatementのクローズ処理
【 警 告 】いくつかのSQL Statement資源がクローズされていません。以下のクローズ処理を試みました。
呼び出し元クラス : jp.co.shiseido.sol.fw.apps.SayHelloFromTableC
-> wisdom.core.connections.managed.ManagedPreparedStatement(468604139) (Statement) SELECT NAME FROM USER WHERE USERID = ? FETCH FIRST 1 ROW ONLY
-> クローズしました。
SQLログの出力
<parameter id='sql.stmt.trace' value='true'/>
上記の設定をtrueにすると、java.sql.Connectionオブジェクトへの操作トレースをすべて出力することができます。ログ出力はパフォーマンスに大きな影響を与えるので開発中の使用に限定してください。
例）　SQLログ出力
2003/06/10 13:44:08 [SQL_TRACE] SayHelloFromTableC: CONN(1598264564).setAutoCommit(autoCommit) > false
2003/06/10 13:44:08 [SQL_TRACE] SayHelloFromTableC: CONN(1598264564).prepareStatement(sql) > SELECT NAME FROM USER WHERE USERID = ? FETCH FIRST 1 ROW ONLY
2003/06/10 13:44:09 [SQL_TRACE] SayHelloFromTableC: PRE_STMT(354866420).setString(parameterIndex,x) > 1 kouda
2003/06/10 13:44:09 [SQL_TRACE] SayHelloFromTableC: PRE_STMT(354866420).executeQuery()
2003/06/10 13:44:09 [SQL_TRACE] SayHelloFromTableC: RESULTSET(1976816884).next()
2003/06/10 13:44:09 [SQL_TRACE] SayHelloFromTableC: RESULTSET(1976816884).getString(columnIndex) > 1 , value=[鴻田 ]
2003/06/10 13:44:09 [SQL_TRACE] SayHelloFromTableC: RESULTSET(1976816884).close()
2003/06/10 13:44:09 [SQL_TRACE] SayHelloFromTableC: PRE_STMT(354866420).close()
2003/06/10 13:44:09 [SQL_TRACE] SayHelloFromTableC: CONN(1598264564).commit()
2003/06/10 13:44:09 [SQL_TRACE] SayHelloFromTableC: CONN(1598264564).close()
</doby>