Tomcat上でのOracle JDBCドライバのJNDIリソース定義

JDBCプログラミングにおいて、Oracle独自のデータ型マッピングなどが必要な場合、 先述のCommons DBCPによるTomcat標準のDataSourceではなく、 Oracle JDBCドライバが用意するDataSourceを使います。 以下がそのリソース定義の例です。

<Resource name="jdbc/xudb" auth="Container" type="oracle.jdbc.pool.OracleDataSource"/>
<ResourceParams name="jdbc/xudb">
    <parameter>
      <name>factory</name><value>oracle.jdbc.pool.OracleDataSourceFactory</value>
    </parameter>
    <parameter><name>driverType</name><value>thin</value></parameter>
    <parameter><name>networkProtocol</name><value>tcp</value></parameter>
    <parameter>
      <name>serverName</name><value>falcon.center.nsnhnkmmkk.co.jp</value>
    </parameter>
    <parameter><name>portNumber</name><value>1521</value></parameter>
    <parameter><name>databaseName</name><value>ORCL</value></parameter>
    <parameter><name>user</name><value>webuser</value></parameter>
    <parameter><name>password</name><value>webpass</value></parameter>
    <parameter><name>maxActive</name><value>50</value></parameter>
    <parameter><name>maxIdle</name><value>20</value></parameter>
    <parameter><name>maxWait</name><value>20000</value></parameter>
    <parameter>
      <name>removeAbandoned</name><value>true</value>
    </parameter>
    <parameter>
      <name>removeAbandonedTimeout</name><value>600</value>
    </parameter>
    <parameter>
      <name>logAbandoned</name><value>true</value>
    </parameter>
</ResourceParams>

OracleのDataSourceを使うには、Resourceのtypeに「oracle.jdbc.pool.OracleDataSource」を、 またResourceParamsのfactoryの値に「oracle.jdbc.pool.OracleDataSourceFactory」 を指定するのがポイントです。 DataSourceリソースの定義では、存在しないパラメータを指定してもエラーにならないので、 Commons DBCPで使っていた maxActiveより後ろのパラメータは、 OracleDataSourceFactoryに指定した場合にも本当に効いているのかよく分かりません。(おーい) それに関連して一見して分かることは、 パラメータの名前がCommons DBCPの場合と幾つか違います。 最も注意が必要なのは、ログオンユーザ名を指定するパラメータがusernameではなくuser となっていることです。 この辺を間違えると、connect()を発行した際に次のようなエラーの原因となります:
  • ORA-12505でエラーになる。
    java.sql.SQLException: Io exception: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=153092352)(ERR=1 2505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
  • SQLException「コールの引数が無効です。」が発生する。
これらの直接的な原因は、 前者はパラメータで指定したサーバ、ポート番号、SIDのリスナーに接続できないという意味、 後者はログオンユーザ名またはパスワードが指定されていないため、 connect()時の接続パラメータが作れないという意味です。 これらの例外が発生した場合は、まず本当にそのメッセージが意味する通りの原因でないか、 スペルミス等を入念に確認します。 それで、何度見ても、目を皿のようにして見ても、逆さにしてひっくり返しても絶対間違いない場合、 次にパラメータ名のスペルミスを確認します。 パラメータ名が間違っていると、当然そのパラメータは無効ですが、 ログにエラーメッセージも出ないので、なかなか見つからないことも多いものです。 それでも見つからなければ、エクスプローラでおもむろにこの.xml をつまんでブラウザのウィンドウに放り込んでみましょう。 MSIEなどXML対応のブラウザだとDOMツリーが字下げつきで表示されると思いますが、 字下げが正しく行われていますか? 私がはまって延々悩んだ例が、「portNumberのparameterタグが、databaseNameのparameterタグも囲んでいる」 というごく単純なXMLの書き間違いでした。


Tomcat+JDBCのトラブルシューティング(Oracle)

SQLException「Unsupported character set」が発生する
OracleのJDBCドライバには、 ojdbc14.jar(classes12.jar)と一緒にnls_charset12.zipがついてきますが、 Tomcatでは、拡張子が.zipだと認識されないようです。
「nls_charset12.jar」と改名すると解決しました。

JDBC and Swing Top

(first uploaded 2006/02/21 last updated 2009/12/20, URANO398)

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル