【问题标题】:error: No operations allowed after connection closed错误:连接关闭后不允许任何操作
【发布时间】:2015-10-21 07:37:42
【问题描述】:

我知道将 SQL 代码或任何与数据库相关的代码放在 JSP 中是个坏主意。但我想尝试这种方式请帮忙。 在retrieve.jsp 中的以下代码中,我必须输入empid 和datefrom 和dateto,然后它将在dispaly.jsp 页面上以表格形式显示结果,其中包含员工的所有详细信息以及总工作时间和加班时间。

retrieve.jsp

%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="com.eis.bean.Provider"%>
<%@page import="com.eis.bean.ConnectionProvider"%>
<%@page import="java.sql.*" %>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
</head>
<body>
    <h4>Enter Employee ID and the dates</h4>
    <form name="retrieve form" action="display1.jsp" method="POST">
        <table border="0">

            <tbody>
                <tr>
                    <td>Employee ID</td>
                    <td><input type="text" name="Emp_id" required="required"/></td>
                </tr>
                <tr>
                    <td>From Date:</td>
                    <td><input type="date" name="From" value="yyyy/MM/dd" required="required"/></td>
                </tr>
                <tr>
                    <td>To Date:</td>
                    <td><input type="date" name="To" value="yyyy/MM/dd" required="required"/></td>
                </tr>
            </tbody>
        </table>
        <input type="reset" value="Clear" name="clear" />
        <input type="submit" value="Submit" name="submit" />
    </form>
</body>
</html>

display.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="com.eis.bean.Provider"%>
<%@page import="com.eis.bean.ConnectionProvider"%>
<%@page import="java.sql.*" %>
<!DOCTYPE html>

<%
String empid = request.getParameter("Emp_id");
String from = request.getParameter("From");
String to = request.getParameter("To");
Connection conn= null;
PreparedStatement ps = null; 
ResultSet rs = null; 

conn = ConnectionProvider.getConn(); 
try {

    ps = conn.prepareStatement("SELECT * FROM timsheetdb.logintable WHERE Emp_id=? and LoginDate BETWEEN ? AND ?; ");
    ps.setString(1, empid); 
    ps.setString(2, from);
    ps.setString(3, to);

    out.print("<table border=1>");  
    out.print("<caption>TimeSheet </caption>");  
    rs = ps.executeQuery();  
    ResultSetMetaData rsmd = rs.getMetaData(); 
    int total=rsmd.getColumnCount();  
     if (rs.next()) {
 %><jsp:include page="retrieve.jsp"/>
<%

    out.print("<center><h1>Timsheet</h1></center>");
    out.print("<b>Employee ID</b> " + empid + "");
    out.print("<br>" + "<b>From Date:</b> " + from);
    out.print("<br>" + "<b>To Date:</b> " + to);
    out.print("<tr>");  
        for(int i=1;i<=total;i++)  
        {  
        out.print("<th>"+rsmd.getColumnName(i)+"</th>");  
        }  
        out.print("</tr>");
 while(rs.next())  
        {  
        out.print("<tr><td>"+rs.getString(1)+"</td><td>"+rs.getString(2)+"</td><td>"+rs.getString(3)+"</td><td>"+rs.getString(4)+"</td><td>"+rs.getString(5)+"</td><td>"+rs.getString(6)+"</td><td>"+rs.getString(7)+"</td><td>"+rs.getString(8)+"</td><td>"+rs.getString(9)+"</td><td>"+rs.getString(10)+"</td></tr>");  

        }  
        out.print("</table>");  
} 
else
     { 
out.println("Please check the Employee ID and Dates "); 
%>
<jsp:include page="retrieve.jsp"/>
<%}
} catch (Exception ex) {
    System.out.println(ex);
}   
finally {  
         if (conn != null) {  
            try {  
                conn.close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        } 

        if (ps != null) {  
            try {  
                ps.close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }  
        if (rs != null) {  
            try {  
                rs.close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }  

    }  
%>

ConnectionProvider.class

import java.sql.*; 

public class ConnectionProvider {  
  private static Connection conn=null;  
  static{  
    try{  
      Class.forName("com.mysql.jdbc.Driver");
      conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/timsheetdb","root","lion");  
    }catch(Exception e){}  
  }  

  public static Connection getConn(){  
    return conn;  
  }  

}

以下是错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:400)
at com.mysql.jdbc.Util.getInstance(Util.java:383)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:958)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)
at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1236)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1231)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4140)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4109)
at org.apache.jsp.display_jsp._jspService(display_jsp.java:113)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2503)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2492)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

【问题讨论】:

    标签: java mysql jsp jdbc


    【解决方案1】:

    您的连接是使用ConnectionProvider.getConn();获得的

    该函数必须确保返回的连接仍然打开,否则返回一个新的连接。

    我猜现在它总是返回一个只创建一次的连接的同一个实例。

    编辑:将您的 ConnectionProvider 更改为:

    public class ConnectionProvider {  
      public static Connection getConn(){  
        try {  
          Class.forName("com.mysql.jdbc.Driver");
          return DriverManager.getConnection("jdbc:mysql://localhost:3306/timsheetdb","root","lion");  
        } catch(Exception e){}  
    
        return null;  
      }  
    }
    

    这不是好的代码,我个人不会那样使用它,但它应该可以解决您的问题。现在每次都会创建一个到数据库的新连接。

    【讨论】:

    • 听起来很有道理。除此之外,您应始终确保在使用后关闭 ResultSetsStatements
    • @f1sh 感谢您的快速回复...您能告诉我如何解决吗?
    • @hendrik 我这样做了,但忘了放那个代码......现在我确实编辑了代码,请检查。
    猜你喜欢
    • 2015-02-16
    • 2014-11-11
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2012-06-06
    • 2020-04-17
    相关资源
    最近更新 更多