java.sql.SQLException:连接关闭后不允许任何操作

时间:2014-09-17 06:07:35

标签: java mysql jsp jdbc

我已经构建了一个使用session维护的应用程序。 它使用JDBC& MySQL的。

在服务器(Apache Tomcat 6)上部署应用程序时。我可以登录并退出会话。工作得很好。

现在我让服务器继续运行24小时。现在第二天我在输入凭据后尝试登录系统,单击“登录”按钮我在网页上收到错误,如下所示: (这是什么原因?)

Http status 500

例外

org.apache.jasper.JasperException:在第11行处理JSP页面/login.jsp时发生异常

9:     Connection con =ConnectionProvider.getConnection();
10:     System.out.println("con "+con);
11:     con.setAutoCommit(false);
12:     Statement st = con.createStatement();
13:     ResultSet rs;
14:     rs = st.executeQuery("select * from ejduge_login where uname='" + userid + "' and pass='" + pwd +"'");


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:524)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


root cause 

javax.servlet.ServletException: java.sql.SQLException: No operations allowed after connection closed.
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
    org.apache.jsp.login_jsp._jspService(login_jsp.java:97)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)


root cause 

java.sql.SQLException: No operations allowed after connection closed.
    com.mysql.jdbc.Connection.checkClosed(Connection.java:2726)
    com.mysql.jdbc.Connection.setAutoCommit(Connection.java:498)
    org.apache.jsp.login_jsp._jspService(login_jsp.java:65)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

提前致谢!

3 个答案:

答案 0 :(得分:4)

我发现,如果MYSQL (&不是34,247,052毫秒),那么关闭连接的默认时间(如果它已处于非活动状态的时间太长)是28800秒(8小时)。

show global variables;

在MYSQL中,我使用

将该值重置为172800秒(根据我的要求,48小时)
set global wait_timeout=172800;

它工作正常。

非常感谢您的帮助!

答案 1 :(得分:2)

如果连接已经处于非活动状态太长时间(默认情况下 34,247,052毫秒),mysql将隐式关闭连接。

这会导致No operations allowed after connection closed错误。所以你可以增加非活动状态超时或通过有效的连接池来处理它

答案 2 :(得分:-1)

它现在可能工作正常,它会在172800秒后出错,你应该添加检查状态值并设置小于172800的值。

就像c3p0 idleConnectionTestPeriod和maxIdleTime。