なぜnullURLと言い、データベースURLを提供したときに例外で空の ''クラスを提供するのですか?
Tomcatを使用しているときに、サーブレットを介してダービーデータベースに接続しようとしています。サーブレットが実行されると、次の例外が発生します。
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)
at servlets.servlet_1.doGet(servlet_1.Java:23) // ---> Marked the statement in servlet
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:722)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:304)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.Java:393)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:243)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:224)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:169)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:472)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:168)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:100)
at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:929)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:405)
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:964)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:515)
at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:302)
at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.Java:885)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:907)
at Java.lang.Thread.run(Thread.Java:619)
Caused by: Java.lang.NullPointerException
at Sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.Java:507)
at Sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.Java:476)
at Sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.Java:307)
at Java.sql.DriverManager.getDriver(DriverManager.Java:253)
at org.Apache.Tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.Java:1437)
... 24 more
サーブレット:
package servlets;
import Java.io.IOException;
import Java.sql.Connection;
import Java.sql.PreparedStatement;
import Java.sql.ResultSet;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.http.*;
import javax.servlet.*;
import javax.sql.DataSource;
public class servlet_1 extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// String queryString = request.getQueryString();
System.out.println("!!!!!!!!!!!!!!!!!!!");
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("Java:comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/PollDatasource");
Connection connection = ds.getConnection(); // -->LINE 23
String sqlQuery = "select * from PollResult";
PreparedStatement statement = connection.prepareStatement(sqlQuery);
ResultSet set = statement.executeQuery();
System.out.println("after the final statement");
} catch (Exception exc) {
exc.printStackTrace();
}
}
}
これはどんな例外ですか?なぜこの例外が発生するのですか?
Tomcatのcontext.xml
に次のタグを追加しました。
<Resource name="jdbc/PollDatasource" auth="Container" type="javax.sql.DataSource"
driverClassName="org.Apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll_database;create=true"
username="suhail" password="suhail"
maxActive="20" maxIdle="10" maxWait="-1" />
これはweb.xml
で:
<resource-ref>
<description>my connection</description>
<res-ref-name>jdbc/PollDatasource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
どこで間違いを犯していますか?
データベースURLを示す画像。
注:@Bryan Pendletonによる回答の後、ドライバーをorg.Apache.derby.jdbc.ClientDriver
に変更しましたが、同じ例外が発生します。 =
明らかな間違いは見当たりませんが、おそらく別のアプローチがデバッグに役立つかもしれません。
グローバルTomcatの代わりに、アプリケーションコンテキストごとにデータソースを指定してみてください。
これを行うには、src/main/webapp/META-INF/context.xmlを作成します(標準のMavenディレクトリ構造を使用していると仮定しています-そうでない場合、META-INFフォルダーは、 WEB-INFディレクトリ)。 META-INF/context.xmlファイルの内容は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/myApp" docBase="myApp"
crossContext="true" reloadable="true" debug="1">
<Resource name="jdbc/PollDatasource" auth="Container"
type="javax.sql.DataSource" driverClassName="org.Apache.derby.jdbc.ClientDriver"
url="jdbc:derby://localhost:1527/poll_database;create=true"
username="suhail" password="suhail" maxActive="20" maxIdle="10" maxWait="-1"/>
</Context>
明らかに、パスとdocBaseはアプリケーションの特定の詳細に一致する必要があります。
このアプローチを使用すると、Tomcatのcontext.xmlファイルでデータソースの詳細を指定する必要がありません。ただし、同じデータベースと通信する複数のアプリケーションがある場合は、アプローチがより理にかなっています。
とにかく、これを旋回させて、それが違いを生むかどうか確かめてください。それはあなたのアプローチで何が悪いのかを知る手がかりになるかもしれません。
いくつかの修正:
環境に適したドライバークラス名を使用します。アウトプロセスのDerbyサーバーを使用している場合、ClientDriver(およびderbyclient.jarを使用する必要があります)、ホスト名、ポートなどが必要です。 Derbyサーバーを処理する場合、derby.jar、EmbeddedDriver、および埋め込みデータベースに適したURLが必要です。
ドライバのJARファイルは、Tomcatのlib/
ディレクトリにのみ配置してください。
Tomcatのconf/context.xml
には何も入れないでください:本当に理由はありません。代わりに、WebアプリのMETA-INF/context.xml
を使用して<Resource>
を定義します。
エラー"Cannot create JDBC driver of class '' for connect URL 'null'
は通常、JDBCドライバーが適切な場所にない(またはTomcatのlib/
ディレクトリだけでなくwebappのWEB-INF/lib/
ディレクトリにもある場所が多すぎる)ために発生します。適切な場所に適切なドライバJARファイルがあることを確認してください。
次の2つのことは一致しません。
driverClassName="org.Apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll database;create=true"
EmbeddedDriverを使用している場合、URLにネットワーク構文を含めることはできません。
逆に、ネットワーク構文を使用している場合は、ClientDriverを使用する必要があります。
http://db.Apache.org/derby/docs/10.8/getstart/rgsquck35368.html
context.xml
を間違ったパスに配置したため、この問題が発生していました。
./src/main/resources/META-INF/context.xml
正しいパスは次のとおりです。
./src/main/webapp/META-INF/context.xml
Eclipseを使用している場合は、Eclipseパッケージエクスプローラーで作成されたサーバープロジェクトからcontext.xmlを変更する必要があります。 EclipseでTomcatを使用する場合、有効なのはそれだけです。その他は無視されるか上書きされます
TomcatをOracleに対して使用すると、同様の問題が発生しました。 Iは、ディスク上のMETA-INFディレクトリにCONTEXT.XMLを持っています。ただし、このファイルはEclipseプロジェクトでは表示されませんでした。 F5リフレッシュで単純なヒットが発生し、context.xmlファイルが表示され、Eclipseがそれを公開しました。すべてがそれを超えて機能しました。これが誰かを助けることを願っています。
EclipseでF5キーを押す
私の場合、META-INF/context.xmlではなく[Tomcat]/Catalina/localhost/[mywebapp_name] .xmlの編集に関する問題を解決しました。
この問題は、TomcatインストールディレクトリにSQL driver
がないためにも発生する可能性があります。
mysql-connector-Java-5.1.23-bin.jar
フォルダにApache-Tomcat-9.0.12/lib/
がなければなりませんでした。
Context envContext = (Context)initContext.lookup("Java:comp/env");
not:Context envContext = (Context)initContext.lookup("Java:/comp/env");
context.xml
でのみリソースを指定しようとしましたか
<Resource name="jdbc/PollDatasource" auth="Container" type="javax.sql.DataSource"
driverClassName="org.Apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll_database;create=true"
username="suhail" password="suhail"
maxActive="20" maxIdle="10" maxWait="-1" />
<resource-ref>
セクションをweb.xml
から削除しますか?
あるプロジェクトでは、<resource-ref>
のweb.xml
セクションのない構成を見て、それが機能しました。
これは経験に基づいた推測ですが、<resource-ref>
のjdbc/PollDatasource
という名前のJNDI
リソースのweb.xml
宣言は、context.xml
の同じ名前のリソースの宣言をオーバーライドし、web.xml
の宣言にdriverClassName
とurl
の両方がないため、そのプロパティのNPEがないと思います。
組み込みドライバーを使用している場合、connectStringはただ
jdbc:derby:databaseName
(; create = true; user = xxxなどのようなオプション)。
クライアントドライバーを使用している場合、接続文字列はそのままにしておくことができますが、ドライバーを変更しても結果が得られない場合は...質問を許しますが、Derby Network Serverを ダービーのチュートリアル ?