- PR -

TomcatにおけるJNDI設定について

1
投稿者投稿内容
MM
会議室デビュー日: 2007/07/31
投稿数: 12
投稿日時: 2007-07-31 12:56
環境は、Vista - Tomcat5.5.23 - JavaSE6 - Oracle9i です。
JDBCドライバは、ojdbc14.jarを$CATALINA_HOME/common/libに配置しています。

TomcatでJNDIを利用して接続プーリングを実現したいと考えています。
以前にも同様のことを行ったことがあり、そのときのメモを頼りに設定を行いましたが、NamingExceptionが発生してしまいうまくいきません。

javax.naming.NamingException: Cannot create resource instance

現在の設定を以下に示します。

【server.xml】
<Context (以降省略)>
<Resource name="jdbc/OracleDB" auth="Container" type="oracle.jdbc.pool.OracleDataSource"/>
<ResourceParams name="jdbc/OracleDB">
<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>dbsv</value>
</parameter>
<parameter>
<name>databaseName</name>
<value>wrdb</value>
</parameter>
<parameter>
<name>portNumber</name>
<value>1521</value>
</parameter>
<parameter>
<name>user</name>
<value>aaa</value>
</parameter>
<parameter>
<name>password</name>
<value>bbb</value>
</parameter>
</ResourceParams>
</Context>

【web.xml】
<resource-ref>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>oracle.jdbc.pool.OracleDataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

【接続のためのJavaプログラム】
InitialContext ic = new InitialContext();
DataSource datasource = (DataSource) ic.lookup("java:comp/env/jdbc/OracleDB");
conn = datasource.getConnection();

※例外はlookupで発生しています。


server.xmlの設定を

<Resource name="jdbc/OracleDB" auth="Container" type="javax.sql.DataSource"/>

とういように変更すると、lookupでは例外が発生しません。
(但し、getConnectionで例外が発生)
このとき作成されているDataSourceの実体は、

org.apache.tomcat.dbcp.dbcp.BasicDataSource

でした。

また、JNDIを利用せずに接続プールをすることは出来ました。

OracleDataSource ods = new OracleDataSource();
ods.setDriverType("thin");
ods.setNetworkProtocol("tcp");
ods.setServerName("dbsv");
ods.setPortNumber(1521);
ods.setDatabaseName("wrdb");
ods.setUser("aaa");
ods.setPassword("bbb");
conn = ods.getConnection();


よって、JNDIの問題であろうと推測しています。
しかし、どこに問題があるのかがわかりません。

よろしくお願いします。
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2007-07-31 15:26
TomcatのJNDIの設定は、5.5系と5.0系で異なります。
MMさんの書き方だと、5.0系のものですね。
こちらを見るといいでしょう。
http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

参考までに、こちらが5.0系の文書です。
http://tomcat.apache.org/tomcat-5.0-doc/jndi-datasource-examples-howto.html
MM
会議室デビュー日: 2007/07/31
投稿数: 12
投稿日時: 2007-07-31 16:47
koeさん、貴重な情報をありがとうございました。
おかげさまで解決することができました。

念のためどのように設定変更したかを以下にまとめておきます。

【server.xml】
<Resource name="jdbc/OracleDB" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@dbsv:1521:wrdb"
username="aaa" password="bbb" maxActive="10" maxIdle="5"
maxWait="-1"/>
</Context>

【web.xml】
<resource-ref>
<description>Oracle Datasource connection</description>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>


接続プールも実現できていることを確認しました。
なお、このとき作成されているDataSourceとConnectionの実体は、

org.apache.tomcat.dbcp.dbcp.BasicDataSource
org.apache.tomcat.dbcp.dbcp.PoolableConnection

でした。

OracleDataSourceクラスなどが使用されるものと思っていたのですが、上記設定でもOKなようです。
また、実験としてOracleConnectionCacheImplクラスが利用される設定にできるかを試してみました。

【server.xml】
<Resource name="jdbc/OracleDB" auth="Container"
type="oracle.jdbc.pool.OracleConnectionCacheImpl"
url="jdbc:oracle:thin:@dbsv:1521:wrdb" factory="oracle.jdbc.pool.OracleDataSourceFactory"
user="aaa" password="bbb" maxLimit="10"/>

【web.xml】
<resource-ref>
<description>Oracle Datasource connection</description>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>oracle.jdbc.pool.OracleConnectionCacheImpl</res-type>
<res-auth>Container</res-auth>
</resource-ref>

この設定でも接続プールは実現できました。
この設定では、作成されたDataSourceとConnectionの実体は、

oracle.jdbc.pool.OracleConnectionCacheImpl
oracle.jdbc.driver.OracleConnection

となりました。
この設定で注意が必要なのは、factoryの指定が必要なこと、DB接続ユーザーの指定はusernameではなくuserにすることです。

いずれにせよ、1日悩まされた問題が解決することができました。
ありがとうございました。



1

スキルアップ/キャリアアップ(JOB@IT)