|
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」と改名すると解決しました。
DATE型の値をJDBCで取得してSimpleDateFormatで解析するとParseExceptionが発生する
知らないわよそんなの!(超投げやり)
といっても仕方がないので、泣く泣く調査しました。
// dataValueはJDBCでOracleDBから取得した値
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date s = sdf.parse(dateValue);
|
で、書式にSSSがついているとojdbc14.jarでは正常に解析できるのに、
ojdbc8.jarでは「java.text.ParseException: Unparseable date」という例外が発生します。
これはJDBC全体の仕様ではなく、Oracle JDBCドライバのDateとTimestampの扱いの変遷で起きているものらしいので、
コードを直すか、データベース表のデータ型をDATE⇒TIMESTAMPに変更するか、JDBCドライバを合わせるかの三択しかないです。

(first uploaded 2006/02/21 last updated 2024/06/29, URANO398)
|