无法为连接 URL “null” 创建类 “” 的 JDBC 驱动程序

2022-09-03 06:16:59

我正在使用Tomcat 7.0.12,每当我尝试通过名为“ROOT”的web应用程序中的.jsp页面访问连接到postgresql db的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服务器上运行了另外2个Web应用程序,使用相同的配置(web.xml和上下文.xml),因此它们可以使用JNDI方法连接到数据库,并且这两个Web应用程序都可以正常工作 - 我可以在这些应用程序中查询和更新数据库,而不会出现任何问题或异常。


答案 1

为了让所有3个Web应用程序正确使用相同的数据源,我必须将所有条目从META-INF /context.xml文件夹移动到服务器的$CATALINA_BASE/conf/context.xml文件夹中。这不是一个很好的解决方案,但它有效。<Resource>


答案 2

我遇到了同样的问题,事实证明,我在上下文中的名称声明.xml与网络上的名称声明.xml上定义的名称不匹配。<Resource><resource-ref>


推荐