簡體   English   中英

無法為連接URL''創建類''的JDBC驅動程序

[英]Cannot create JDBC driver of class '' for connect URL 'null'

我正在使用Tomcat 7.0.12並且每當我通過名為'ROOT'的webapp中的.jsp頁面訪問連接到postgresql數據庫的JNDI數據源時都會收到此錯誤:

SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception
[java.lang.RuntimeException: Cannot create JDBC driver of class '' for connect URL 'null'] with root cause
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)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

postgresql JDBC驅動程序位於我的CATALINA / lib文件夾中。

這是我的META-INF / context.xml:

<?xml version="1.0" encoding="UTF-8"?>

<Context>

<Resource name="jdbc/webdbro" auth="Container" type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/webdb"
    username="webdbro" password="pass" maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="30"/>

<Resource name="jdbc/webdbrw" auth="Container" type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/webdb"
    username="webdbrw" password="pass" maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="30"/>

<Resource name="jdbc/shadowdbro" auth="Container" type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432/shadowdb"
    username="shadowdbro" password="pass" maxWait="-1" removeAbandoned="true" removeAbandonedTimeout="30"/>

</Context>

這是我的WEB-INF / web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>ROOT</display-name>

<resource-ref>
    <description>Read only webdb connector.</description>
    <res-ref-name>jdbc/webdbro</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <description>Read write webdb connector.</description>
    <res-ref-name>jdbc/webdbrw</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <description>Read only shadow db connector.</description>
    <res-ref-name>jdbc/shadowdbro</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

</web-app>

奇怪的是我在同一個Tomcat服務器上使用完全相同的配置(web.xml和context.xml)運行了2個其他webapp,因此他們可以使用JNDI方法連接到數據庫,這些webapps的兩個工作完全正常 - 我可以在這些應用程序中查詢和更新數據庫,沒有任何問題或例外。 TIA ...

為了讓所有3個webapps正確使用相同的數據源,我必須將所有<Resource>條目從META-INF / context.xml文件夾移動到服務器的$ CATALINA_BASE / conf / context.xml文件夾中。 不是一個很好的解決方案,但它確實有效

我遇到了同樣的問題,結果是我在context.xml上的<Resource>名稱聲明與web.xml上<resource-ref> name上定義的名稱聲明不匹配。

如上所述,一種解決方案是將條目移動到$ CATALINA_BASE / conf / context.xml

這里描述了另一種方法: http//blogs.agilefaqs.com/2009/11/23/cannot-create-jdbc-driver-of-class-for-connect-url-null/

特別是,“將Context.xml文件復制到tomcat / conf / Catalina / localhost文件夾並將其重命名為<web_app_name>.xml

根本原因可能是由於文件權限問題:“運行tomcat的用戶沒有寫入這些文件夾的權限。所以我們將tomcat和/ etc / tomcat文件夾的組所有權更改為同一組這是tomcat用戶所屬的,而且神奇的一切都像以前一樣開始運作。“

這個解決方案對我來說似乎“更清潔”,因為您可以將整個Web應用程序(包括數據庫連接屬性)包含在.war文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM