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

Posted

技术标签:

【中文标题】java.sql.SQLException:连接关闭后不允许任何操作【英文标题】:java.sql.SQLException: No operations allowed after connection closed 【发布时间】:2014-11-11 01:36:03 【问题描述】:

我已经构建了一个应用程序,由会话维护。 它使用 JDBC 和 mysql

当应用程序部署在服务器 (Apache Tomcat 6) 上时。我可以登录和退出会话。完全没问题。

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

Http 状态 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)

提前致谢!

【问题讨论】:

ConnectionProvider 拒绝连接,所以con 不包含连接,因此出现错误! :) 您是否配置了任何连接池? ConnectionProvider.getConnection() 中隐藏了什么? 【参考方案1】:

我发现,如果连接不活动时间过长,关闭连接的默认时间是 28800 秒(8 小时),对于 MYSQL(而不是 34,247,052 毫秒)

show global variables;

在 MYSQL 中,我将该值重置为 172800 秒(根据我的要求为 48 小时)

set global wait_timeout=172800;

效果很好。

非常感谢您的帮助!

【讨论】:

默认值可以在你特定版本的 mysql 的 oracles 文档中找到。这是 5.7 的默认值:dev.mysql.com/doc/refman/5.7/en/…【参考方案2】:

如果长时间不活动(34,247,052毫秒默认),mysql将隐式关闭连接。

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

【讨论】:

【参考方案3】:

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

就像 c3p0 idleConnectionTestPeriod 和 maxIdleTime。

【讨论】:

以上是关于java.sql.SQLException:连接关闭后不允许任何操作的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:Io 异常:套接字读取超时与关闭连接

java.sql.SQLException:连接已关闭 [POOL-HikariCP]

java.sql.SQLException:无法从底层数据库获取连接! — HSQLDB

JDBC内部连接java.sql.SQLException:未选择数据库[重复]

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

java连接sql server 2005的问题 java.sql.SQLException: No suitable driver