- - PR -
TomcatにおけるJNDI設定について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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の問題であろうと推測しています。 しかし、どこに問題があるのかがわかりません。 よろしくお願いします。 |
|
投稿日時: 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 |
|
投稿日時: 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