postgresql JNDI 无法在 Tomcat 6 上创建 JDBC 连接
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3744278/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JNDI Can't Create a JDBC Connection on Tomcat 6
提问by wswartzendruber
I'm getting this error when I try to view the page:
当我尝试查看页面时出现此错误:
SQLException: Cannot create JDBC driver of class '' for connect URL 'null'
I have the following /WEB-INF/web.xml:
我有以下/WEB-INF/web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>WSwartzendruber.net</display-name>
<description>Personal Website</description>
<!-- Servlet stuff -->
<servlet>
<servlet-name>PostgresTest</servlet-name>
<servlet-class>PostgresTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PostgresTest</servlet-name>
<url-pattern>/servlets/postgrestest</url-pattern>
</servlet-mapping>
<!-- JNDI -->
<resource-ref>
<description>PostgreSQL Data Source</description>
<res-ref-name>jdbc/db_website</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
I have this in /META-INF/context.xml:
我在 /META-INF/context.xml 中有这个:
<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true">
<Resource name="jdbc/db_website" auth="Container" type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/db_website" username="website"/>
</Context>
And here is the test code:
这是测试代码:
import java.io.*;
import java.sql.*;
import javax.naming.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.*;
import org.wswartzendruber.website.access.*;
public class PostgresTest extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException
{
response.setContentType("text/plain");
try
{
Context initialContext = new InitialContext();
Context context = (Context)initialContext.lookup("java:comp/env");
DataSource dataSource = (DataSource)context.lookup("jdbc/db_website");
Connection connection = dataSource.getConnection();
NewsCategory[] newsCategory = NewsCategory.getNewsCategories(connection);
connection.close();
}
catch (NamingException e)
{
response.getWriter().println("ERROR: We have naming problems!");
}
catch (SQLException se)
{
response.getWriter().println("ERROR: SQLException: " + se.getMessage());
}
catch (AccessException ae)
{
response.getWriter().println("ERROR: AccessException: " + ae.getMessage());
}
}
}
I'm at a loss for what the issue is. I already have /usr/share/tomcat-6/lib/postgresql-8.4-702.jdbc4.jar in place. Moving it to /WEB-INF/lib makes no difference. It seems to me that it can see the resource entry in WEB-INF/web.xml, but that it can't pull the details from META-INF/context.xml. Assigning a password there also seems to make no difference.
我不知道问题是什么。我已经有了 /usr/share/tomcat-6/lib/postgresql-8.4-702.jdbc4.jar 。将其移动到 /WEB-INF/lib 没有区别。在我看来,它可以看到 WEB-INF/web.xml 中的资源条目,但它无法从 META-INF/context.xml 中提取详细信息。在那里分配密码似乎也没有什么区别。
I'm up for whatever you guys have.
我愿意接受你们所拥有的一切。
Update: here is the full stacktrace:
更新:这是完整的堆栈跟踪:
Sep 19, 2010 7:01:36 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet PostgresTest threw exception
java.io.IOException: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
at PostgresTest.doGet(PostgresTest.java:23)
at javax.servlet.http.HttpServlet.service(Unknown Source)
at javax.servlet.http.HttpServlet.service(Unknown Source)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
at org.apache.catalina.core.StandardWrapperValve.invoke(Unknown Source)
at org.apache.catalina.core.StandardContextValve.invoke(Unknown Source)
at org.apache.catalina.core.StandardHostValve.invoke(Unknown Source)
at org.apache.catalina.valves.ErrorReportValve.invoke(Unknown Source)
at org.apache.catalina.core.StandardEngineValve.invoke(Unknown Source)
at org.apache.catalina.connector.CoyoteAdapter.service(Unknown Source)
at org.apache.jk.server.JkCoyoteHandler.invoke(Unknown Source)
at org.apache.jk.common.HandlerRequest.invoke(Unknown Source)
at org.apache.jk.common.ChannelSocket.invoke(Unknown Source)
at org.apache.jk.common.ChannelSocket.processConnection(Unknown Source)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(Unknown Source)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(Unknown Source)
at java.lang.Thread.run(Thread.java:636)
Caused by: 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 PostgresTest.doGet(PostgresTest.java:17)
... 17 more
Caused by: java.lang.NullPointerException
at org.postgresql.Driver.parseURL(Driver.java:567)
at org.postgresql.Driver.acceptsURL(Driver.java:412)
at java.sql.DriverManager.getDriver(DriverManager.java:268)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
... 20 more
回答by BalusC
The "caused by"/"root cause" part of the exception contains information about why it has failed. You should not print only the exception message and ignore the remnant of the exception detail. You should throw the entire exception or at least print the entire stacktrace.
异常的“由”/“根本原因”部分包含有关其失败原因的信息。您不应只打印异常消息而忽略异常详细信息的剩余部分。您应该抛出整个异常或至少打印整个堆栈跟踪。
A quick fix: replace your try
by
快速修复:替换你try
的
try {
Context initialContext = new InitialContext();
Context context = (Context)initialContext.lookup("java:comp/env");
DataSource dataSource = (DataSource)context.lookup("jdbc/db_website");
Connection connection = dataSource.getConnection();
NewsCategory[] newsCategory = NewsCategory.getNewsCategories(connection);
connection.close();
} catch (Exception e) {
throw new ServletException(e);
}
And retry. The whole stacktrace should show up in the server's default error page. Or if you have customized the error page that it doesn't show the trace, then look in the server logs, it's there as well.
并重试。整个堆栈跟踪应显示在服务器的默认错误页面中。或者,如果您自定义了不显示跟踪的错误页面,则查看服务器日志,它也在那里。
Updateas per the comment: You could just add ServletException
to the throws
clause. According to the stacktrace, the resource in context.xml
is correctly located, the driver is correctly loaded, but the URL has not been passed in as if it's not been specified in the <Resource>
.
根据评论更新:您可以添加ServletException
到throws
条款中。根据堆栈跟踪,context.xml
正确定位了资源,正确加载了驱动程序,但未传入 URL,就像未在<Resource>
.
Are you sure that you're supplying the <Resource>
you think you're supplying? Don't you have another <Resource>
with the same name, but without an url
in Tomcat/conf/context.xml
?
你确定你提供的是<Resource>
你认为你提供的吗?你没有另一个<Resource>
同名但没有url
in 的Tomcat/conf/context.xml
吗?
回答by user1919466
Yes I also had this problem。If I put the segment into the tomcat/conf/context.xml,it could work。I did‘t know why
是的,我也有这个问题。如果我把这个segment放到tomcat/conf/context.xml里就可以了。不知道为什么
回答by sarath
Add context.xml in WebRoot/META-INF folder and put
在 WebRoot/META-INF 文件夹中添加 context.xml 并放置
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/ecms" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="root123#" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ecms"/>
In web.xml page write
在 web.xml 页面中写入
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/ecms</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Form a new java class and write
形成一个新的java类并编写
package com.common;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.sql.DataSource;
public class DataSourceq {
public Connection dbc() throws NamingException, SQLException, ServletException{
try {
InitialContext initialContext = new InitialContext();
Context context = (Context)initialContext.lookup("java:comp/env");
//The JDBC Data source that we just created
DataSource ds = (DataSource) context.lookup("jdbc/ecms");
Connection connection = ds.getConnection();
return connection;
}
catch (Exception e) {
throw new ServletException(e);
}
}
}
Create object for your Data source Class and call
为您的数据源类创建对象并调用
DataSourceq dq = new DataSourceq();
Connection con = dq.dbc();
And Execute your Query It will Work Sucessfully
并执行您的查询它会成功