Nie można utworzyć sterownika JDBC klasy ''dla connect URL 'null': Nie rozumiem tego wyjątku
Dlaczego jest napisane null URL i daje pustą klasę '' w wyjątku, gdy podałem adres URL bazy danych?
Próbuję połączyć się z bazą danych derby przez servlet podczas korzystania z Tomcat. Gdy servlet zostanie uruchomiony, dostaję następujące wyjątki:
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
Servlet:
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();
}
}
}
Co to za wyjątek? Dlaczego dostaję ten wyjątek?
Dodałem następujący tag w context.xml
Tomcat:
<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" />
Oraz to w 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>
Gdzie popełniam błąd?
obrazek pokazujący adres URL bazy danych..
UWAGA : Po odpowiedzi @Bryan Pendleton zmieniłem sterownik na org.apache.derby.jdbc.ClientDriver
ale dostaję ten sam wyjątek.
11 answers
Nie widzę nic ewidentnie złego, ale może inne podejście pomoże Ci to debugować?
Możesz spróbować określić swoje źródło danych w kontekście aplikacji zamiast globalnego Tomcata.
Możesz to zrobić, tworząc src / main / webapp / META-INF / context.xml (zakładam, że używasz standardowej struktury katalogów maven - jeśli nie, to folder META-INF powinien być rodzeństwem Twojego katalogu WEB-INF). Zawartość META-INF / context.plik xml będzie wygląda jak:
<?xml version="1.0" encoding="UTF-8"?>
<Context [optional other attributes as required]>
<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>
Oczywiście ścieżka i docBase musiałyby pasować do konkretnych danych twojej aplikacji.
Używając tego podejścia, nie musisz określać szczegółów źródła danych w kontekście Tomcat.plik xml. Chociaż jeśli masz wiele aplikacji rozmawiających z tą samą bazą danych, twoje podejście ma większy sens.
W każdym razie, daj temu wir i zobacz, czy to robi jakąś różnicę. To może dać nam wskazówkę, co dzieje się nie tak z Twoim podejdźcie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-07 14:36:55
Kilka poprawek:
Użyj odpowiedniej nazwy klasy sterownika dla swojego środowiska: jeśli używasz out-of-process Derby server, to chcesz ClientDriver (i musisz użyć derbyclient.jar), nazwę hosta i port, itp. Jeśli chcesz serwer Derby w trakcie, To chcesz derby.jar, EmbeddedDriver i adres URL odpowiedni dla osadzonej bazy danych.
Umieść plik driver Jar tylko w katalogu Tomcat
lib/
.Nic nie wkładaj. w Tomcat ' s
conf/context.xml
: naprawdę nie ma ku temu powodu. Zamiast tego użyj aplikacji webappMETA-INF/context.xml
, aby zdefiniować swoje<Resource>
.
Błąd "Cannot create JDBC driver of class '' for connect URL 'null'
zwykle występuje, ponieważ sterownik JDBC nie znajduje się we właściwym miejscu (lub w zbyt wielu miejscach, takich jak katalog Tomcat lib/
, ale także w katalogu webapp WEB-INF/lib/
). Sprawdź, czy masz odpowiedni plik JAR sterownika we właściwym miejscu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-22 21:23:43
Te dwie rzeczy nie pasują:
driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
url="jdbc:derby://localhost:1527/poll database;create=true"
Jeśli używasz EmbeddedDriver, Twój adres URL nie powinien zawierać składni sieciowej.
Odwrotnie, jeśli używasz składni sieciowej, musisz użyć ClientDriver.
Http://db.apache.org/derby/docs/10.8/getstart/rgsquck35368.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-29 09:34:25
Miałem ten problem, ponieważ umieściłem context.xml
w złej ścieżce:
./src/main/resources/META-INF/context.xml
Prawidłowa ścieżka brzmiała:
./src/main/webapp/META-INF/context.xml
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-01 11:50:00
Jeśli używasz eclipse, powinieneś zmodyfikować kontekst.xml, z projektu serwera utworzonego w Eksploratorze pakietu eclipse. Podczas korzystania z tomcat w eclipse jest to jedyny poprawny, pozostałe są ignorowane lub nadpisywane
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-25 09:50:47
Context envContext = (Context)initContext.lookup("java:comp/env");
Nie: Context envContext = (Context)initContext.lookup("java:/comp/env");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-17 06:02:21
Czy próbowałeś określić zasób tylko w 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" />
I usunąć <resource-ref>
sekcję z web.xml
?
W jednym projekcie widziałem konfigurację bez sekcji <resource-ref>
w web.xml
i zadziałało.
To wyedukowane przypuszczenie, ale myślę, że <resource-ref>
deklaracja JNDI
zasobu o nazwie jdbc/PollDatasource
W web.xml
może zastąpić deklarację zasobu o tej samej nazwie w context.xml
i deklaracji w web.xml
brakuje zarówno driverClassName
, jak i url
stąd NPE dla tych właściwości.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 14:32:29
W moim przypadku rozwiązałem problem z edycją [tomcat]/Catalina/localhost / [mywebapp_name].xml zamiast META-INF / context.xml.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-01 15:11:35
Problem może wystąpić również z powodu braku SQL driver
w katalogu instalacyjnym Tomcat.
Musiałem mieć mysql-connector-java-5.1.23-bin.jar
w apache-tomcat-9.0.12/lib/
folderze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-16 10:22:46
Jeśli używasz wbudowanego sterownika, connectString jest po prostu
jdbc:derby:databaseName
(Gdzie opcje takie jak; create = true; user=xxx itd.).
Jeśli używasz sterownika klienta, łańcuch connect może zostać pozostawiony w takim stanie, ale jeśli zmiana sterownika nie daje rezultatu... przepraszam za pytanie, ale czy jesteś w 100% pewien, że uruchomiłeś serwer sieci Derby zgodnie z Tutorial Derby ?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-20 14:48:52
Miałem podobny problem używając Tomcat przeciwko Oracle. I DID have the context.xml w katalogu META-INF, na dysku. Ten plik nie był jednak wyświetlany w projekcie eclipse. Proste trafienie w odświeżanie F5 i kontekst.pojawił się plik xml i eclipse go opublikowało. Wszystko po tym działało. Mam nadzieję, że to komuś pomoże.
Spróbuj wcisnąć F5 w eclipse
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 16:05:05