「アプリケーション開発」のための汎用性が高い、かつ単純なAPIを持ったフルスタックのJavaフレーム
  • TEL: 03-6418-5221
  • TEL: 03-6418-5221

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 PativePostgre Postgres org.postgresql.Driver jdbc:postgresql:
3 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()