2

私は同様の質問を探しましたが、 Gaddy JNDI Problem---接続 URL '' のクラス '' の JDBC ドライバーを作成できません'' のような類似した質問しか見つかりませんでした。これは私の一般的な質問に答えません。

Tomcat 7.0.8 ..次のコード

Context initialContext = new InitialContext();
datasource = (DataSource) initialContext.lookup("java:comp/env/" + "blah");
Connection c = null;
c = datasource.getConnection();

このエラーをスローします。

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
   at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
   at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
   at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
...
Caused by: java.lang.NullPointerException
   at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:527)
   at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:496)
   at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:319)
   at java.sql.DriverManager.getDriver(DriverManager.java:386)
   at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
   ... 24 more

失敗した理由や修正方法を尋ねているわけではありません。

私の質問は、LOOKUP が失敗しなかったのはなぜですか?

ルックアップによって、null URL を持つ役に立たない BasicDataSource が作成されたのはなぜですか? JNDI名が「存在しない」かどうかを検出するには、それを使用して爆発するかどうかを確認するよりも良い方法はありますか? そのアプローチは、彼らがブリッジをテストする方法を思い出させます。

私はついに弾丸をかじって、生の JDBC コードから JNDI に大量のコードを移動しましたが、まだ多くの謎が残っています。

少なくともデータベースの独立性の錯覚を維持するために、可能であれば BasicDataSource のダウンキャストを避けたいと思います。

ティア

4

2 に答える 2

4

私が理解しているように、JNDI は、オブジェクト または オブジェクト ファクトリへの参照を保持するためのものです。

オブジェクトのビジネスは単純です。configurer がオブジェクトへの参照を提供し、app がそれを使用するという単純なものです。しかし、より複雑または一般的なケースでは、オブジェクト ファクトリへの参照を提供する方が便利です。これにより、オブジェクトの作成方法がはるかに自由になります。

webappweb.xmlも Tomcat も投稿していないのでconf/server.xml、詳しく説明するのは難しいですが、web.xml に似たようなものがあると思います。

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/myDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

Tomcat の JNDI ハウツーを読むと、次のように表示されます。

リソースの作成に使用する適切なリソース ファクトリを Tomcat が識別でき、それ以上の構成情報が必要ない場合、Tomcat は /WEB-INF/web.xml 内の情報を使用してリソースを作成します。

それでは、上記の Tomcat の実装を見てみましょう。res-type112 行目で、 がと等しい場合javax.sql.DataSource、 を使用org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactoryして新しいデータ ソースを作成することがわかります。

それでおしまい。この時点で、JNDI はオブジェクトの作成方法に影響を与えないため、JNDI の作業は終了しました。JNDI は、あらゆる種類のオブジェクト (メール接続、セキュリティ レルムなど) への参照を格納することを意図していることを忘れないでください。さまざまなタイプのオブジェクトごとにテストを作成することは不可能であり、不合理です。それでも、データベース設定があるだけでは、これらが実際のデータベースへのライブ接続を確立するのに十分かどうかを判断することは不可能です.

そのため、別の呼び出しがあり、キャッチして処理する必要があるdatasource.getConnection()ものをスローします。SQLException

BasicDataSourceFactorypsよりスマートで、必須のプロパティ/引数のリストが必要であると主張する可能性があります。多分。しかし、これは別の質問の対象です。元々、LOOKUP が失敗しなかった理由を尋ねたよう です ;)

于 2011-02-26T21:27:22.250 に答える
1

tomcat で war ファイルを実行すると、web.xml と server.xml が連携して、ここで説明する定義が提供されます。Eclipse では、思っていたものとは異なる web.xml を使用している場合があります。Eclipse のデバッガーが期待どおりの web および server.xml ファイルをロードしていることを確認してください。私の場合、web.xmlに定義がないことがわかったので、そこに追加するとうまくいきました。

于 2014-03-25T12:54:41.483 に答える