【问题标题】:Cannot create JDBC driver of class '' for connect URL 'null'无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序
【发布时间】:2011-11-08 15:18:10
【问题描述】:

我正在使用 Tomcat 7.0.12,每当我尝试通过名为“ROOT”的 web 应用程序中的 .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>

奇怪的是,我有 2 个其他 webapps 使用完全相同的配置(web.xml 和 context.xml)在同一个 Tomcat 服务器上运行,因此它们可以使用 JNDI 方法连接到数据库和这些 webapps工作得很好——我可以在这些应用程序中查询和更新数据库,没有问题或异常。 TIA...

【问题讨论】:

  • Exception 告诉 Tomcat 没有读取/找到您配置的 &lt;Resource&gt;。你是从 Eclipse 内部运行 webapp 还是什么?

标签: java postgresql tomcat jndi


【解决方案1】:

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

【讨论】:

  • 对 context.xml 的更新不会在 $CATALINA_BASE/conf/context.xml 中生效,除非您重新部署 webapp 或自己将它们应用到该文件夹​​中。
  • 谢谢。经过 6 小时的追查,您的解决方案奏效了。
【解决方案2】:

我遇到了同样的问题,结果证明我在 context.xml 上的 &lt;Resource&gt; 名称声明与在 web.xml 上的 &lt;resource-ref&gt; 名称上定义的不匹配。

【讨论】:

    【解决方案3】:

    如上所述,一种解决方案是将条目移动到 $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 文件夹并重命名为&lt;web_app_name&gt;.xml”

    根本原因可能是由于文件权限问题:“运行tomcat的用户没有权限写入这些文件夹。所以我们将tomcat和/etc/tomcat文件夹的组所有权更改为tomcat 用户所属的同一组,神奇地一切都开始像以前一样工作。”

    这个解决方案对我来说似乎“更干净”,因为您可以将整个 Web 应用程序(包括数据库连接属性)打包在一个 .war 文件中。

    【讨论】:

      猜你喜欢
      • 2018-01-14
      • 2011-05-14
      • 2011-07-06
      • 2015-04-15
      • 2015-12-18
      • 2014-01-25
      • 2019-02-05
      • 1970-01-01
      相关资源
      最近更新 更多