javax.servlet.ServletException:通信链接失败

时间:2011-04-26 05:19:30

标签: java mysql jsp tomcat jdbc

我尝试了以下用于连接数据库的jsp代码。

Connection conn=null;
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                conn = DriverManager.getConnection("jdbc:mysql://localhost/TestDB?user=root&password=123");

                if (conn != null) {
                    out.println("connected");
                }
                else
                    {
                    out.println("connection failed");
                }

当我将此文件上传到一个文件夹时,数据库正确连接。

但我尝试使用另一个测试文件夹的相同文件,我收到以下错误

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
java.security.AccessController.doPrivileged(Native Method)
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
sun.reflect.GeneratedMethodAccessor152.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:218)

root cause

javax.servlet.ServletException: Communications link failure

Last packet sent to the server was 0 ms ago.
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
    org.apache.jasper.runtime.PageContextImpl.access$1100(PageContextImpl.java:64)
    org.apache.jasper.runtime.PageContextImpl$12.run(PageContextImpl.java:761)
    java.security.AccessController.doPrivileged(Native Method)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:759)
    org.apache.jsp.test_jsp._jspService(test_jsp.java:71)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
    java.security.AccessController.doPrivileged(Native Method)
    javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
    org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
    org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
    java.security.AccessController.doPrivileged(Native Method)
    org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
    sun.reflect.GeneratedMethodAccessor152.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
    java.security.AccessController.doPrivileged(Native Method)
    javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
    org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
    org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:218)

可以帮助我纠正这些问题。

2 个答案:

答案 0 :(得分:0)

因此,您直接在JSP中创建数据库连接,包括在视图中对您的凭据进行硬编码 - 您永远不应该这样做!然后你没有在任何异常处理中包装你的代码,这就是你将ServletException作为一般错误消息并且真正原因未知的原因 - Servlet Container在try ... catch块中包装JSP,捕获发生的任何错误并抛出一个ServletException。

我也看不到你关闭你的连接,但你关闭了,不是吗?

首先,在视图中放置凭据是非常糟糕的,其次,您永远不知道有多少人将访问您的页面,因此您可能会溢出数据库连接。首先将数据库连接详细信息放在JNDI中,使用连接池而不是自己创建连接(仍然需要关闭池连接,以便连接返回池,除非使用单个共享连接,这不是关闭连接并没有错误)并控制你的错误,以便你可以看到如果出现问题会发生什么。

Tomcat(我们可以看到你使用的内容)包括连接池和JNDI,只需使用它们。您可以在这里找到更多:Tomcat JNDI HowTo

答案 1 :(得分:0)

链接失败通常意味着尝试与服务通信时出现问题。也就是说,似乎您的jsp无法在连接级别连接到您的数据库。您是否在localhost上侦听数据库实例?你是否有防火墙阻止你的jsp和你的数据库实例之间的通信?