我正在使用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>
奇怪的是,我有两个其他Web应用程序在完全相同的配置(web.xml和context.xml)下在同一Tomcat服务器上运行,因此它们可以使用JNDI方法连接到数据库,并且这些Webapp都可以正常运行- 我可以查询和更新数据库,而这些应用程序中没有任何问题或异常。TIA …
为了使所有3个Web应用程序正确使用相同的数据源,我必须将所有<Resource>条目从META-INF / context.xml文件夹移至服务器的$ CATALINA_BASE / conf / context.xml文件夹。这不是一个很好的解决方案,但是可以。
<Resource>