- PR -

JNDIについて(長文です)

投稿者投稿内容
ニューフェイス
会議室デビュー日: 2004/11/01
投稿数: 13
投稿日時: 2004-11-01 16:27
グローバルネーミング(?)を利用したOracleの
コネクションプーリングを実現しようと思っていますが、
以下のようなエラーが出てしまいます。
どなたか対処方法をご教授願えないでしょうか?
宜しくお願い致します。
(server.xmlやweb.xmlの中身は、Jakartaのソースをほぼそのまま適用しています)

OS :Win2000
JDK :1.4.2
Oracle:8i
AP :Tomcat5

javax.naming.NoInitialContextException:
Need to specify class name in environment or system property,
or as an applet parameter,
or in an application resource file: java.naming.factory.initial

at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:280)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at test.Pooling.main(Pooling.java:27)
Exception in thread "main"

<<server.xmlに追加した中身>>
<GlobalNamingResources>
<Resource name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/myoracle">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>driverType</name>
<value>thin</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@localhost:1521:ORCL</value>
</parameter>
<parameter>
<name>username</name>
<value>scott</value>
</parameter>
<parameter>
<name>password</name>
<value>tiger</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>20</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
....
</GlobalNamingResources>

<<web.xmlに追加した中身>>
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-01 17:11
InitialContextFactory を指定していないのではないでしょうか?
ニューフェイス
会議室デビュー日: 2004/11/01
投稿数: 13
投稿日時: 2004-11-01 18:35
早速の返信、ありがとうございます。

>InitialContextFactory を指定していないのではないでしょうか?

とありますが、
Context ctx = new InitialContext();
としている為、私自身は指定していると思っていますが、見当違いでしょうか?

具体的には、以下でエラーが発生します。
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/myoracle");//←ここでエラー
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-01 19:01
引用:

ニューフェイスさんの書き込み (2004-11-01 18:35) より:
Context ctx = new InitialContext();
としている為、私自身は指定していると思っていますが、見当違いでしょうか?


スタックトレースから見て、Webアプリケーションではなくコンソールアプリケーションから
実行されているように思います。Webアプリケーションの場合はコンテキストが特定されて
いるのでこれでいいですが、コンソールアプリケーションの場合は参照するコンテキストの
情報を渡してやる必要があります。

とはいうものの、TomcatのJNDIオブジェクトを外部から呼び出すインタフェースって見たこと
ないのですが、どこかに公開されていましたっけ?

それからこの部分は、
DataSource ds = (DataSource)ctx.lookup("jdbc/myoracle");
こっちが正しいでしょう。
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/myoracle");
ニューフェイス
会議室デビュー日: 2004/11/01
投稿数: 13
投稿日時: 2004-11-01 20:10
返信、ありがとうございます。

>スタックトレースから見て、Webアプリケーションではなくコンソールアプリケーションから
>実行されているように思います。

そのとおりです。まずはコンソールアプリケーションでやってみて、
OKならWebアプリに移行しようと思っていました。
(このあたりも初めの投稿時に記述すべきだったのでしょうか?)

>Webアプリケーションの場合はコンテキストが特定されて
>いるのでこれでいいですが、コンソールアプリケーションの場合は参照するコンテキストの
>情報を渡してやる必要があります。
>とはいうものの、TomcatのJNDIオブジェクトを外部から呼び出すインタフェースって見たこと
>ないのですが、どこかに公開されていましたっけ?

ということは、コンソールアプリケーションでは実装不可能ということでしょうか?
Webアプリケーションならこのままでも大丈夫なのでしょうか?

>それからこの部分は、
>DataSource ds = (DataSource)ctx.lookup("jdbc/myoracle");
>こっちが正しいでしょう。
>DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/myoracle");

なぜ「下」のほうが正しいのか、教えていただけないでしょうか?
『どこかに載っている!』等の情報でも結構ですので、宜しくお願い致します。
質問ばかりで申し訳ありませんが、宜しくお願い致します。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-01 21:23
引用:

ということは、コンソールアプリケーションでは実装不可能ということでしょうか?


Tomcatではやったことがないし、文書も見つからないですね。EJBコンテナなら通常は外部
から呼び出せるようにインタフェース公開していますけど。

引用:

Webアプリケーションならこのままでも大丈夫なのでしょうか?


設定に間違いがなければ大丈夫でしょう。

引用:

なぜ「下」のほうが正しいのか、教えていただけないでしょうか?
『どこかに載っている!』等の情報でも結構ですので、宜しくお願い致します。
質問ばかりで申し訳ありませんが、宜しくお願い致します。


まずは、Tomcatのドキュメントそのものを読んでみてはどうでしょうか。
http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jndi-datasource-examples-howto.html
http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/jndi-datasource-examples-howto.html
ニューフェイス
会議室デビュー日: 2004/11/01
投稿数: 13
投稿日時: 2004-11-02 14:26
返信、ありがとうございます。
で、今回は以下のような単純なJSPを作り、実行してみました。
ところが、まだエラーが出てしまいます。
server.xmlやweb.xmlは初めの投稿と同じ内容です。
宜しくお願い致します。

****ソース内容****
InitialContext initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/myoracle");
Connection vConnect = ds.getConnection();
Statement vStmt = vConnect.createStatement();
ResultSet vResult = vStmt.executeQuery("select sysdate from dual");
out.println(vResult.getDate(0));
vResult.close();
vStmt.close();
vConnect.close();

****エラー内容****
javax.servlet.ServletException: Cannot create JDBC driver of class '' for connect URL 'null'
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
org.apache.jsp.pooling_jsp._jspService(pooling_jsp.java:91)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)



[ メッセージ編集済み 編集者: ニューフェイス 編集日時 2004-11-02 14:29 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-02 15:29
例外がどこで発生しているのか、もう少し詳しい情報が欲しいところですね。JSPの中で
例外をキャッチして、スタックトレースを吐かせてみてもらえないでしょうか。

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