本帖最后由 b4589832 于 2010-05-05 09:36:54 编辑

解决方案 »

  1.   

    你仔细看代码了么?
    sing.getConnection();
      

  2.   

    新建立的连接
    stmt已存在继续使用
    java.sql.SQLException: 关闭的连接
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:207)
    at oracle.jdbc.driver.OracleStatement.ensureOpen(OracleStatement.java:3512)
    at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1586)
    at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1570)
    at com.gmtoa.struts.sysManagement.holidays.impl.HoliDaysOperImpl.processData(HoliDaysOperImpl.java:235)
    at com.gmtoa.struts.sysManagement.holidays.impl.HoliDaysOperImpl.addHolidaysData(HoliDaysOperImpl.java:212)
    at com.gmtoa.struts.sysManagement.holidays.action.HoliDaysOperAction.addHolidaysData(HoliDaysOperAction.java:124)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
    at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at com.medi.filter.Filter.doFilter(Filter.java:22)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:831)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:652)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1203)
    at java.lang.Thread.run(Thread.java:619)
    retStr = no
      

  3.   

    public int processData(Statement stm,String sql){
    try {
    return stm.executeUpdate(sql);
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return 0;
    }
      

  4.   

    stmt 也需要关闭,记得关闭链接的顺序是由大到小的,con--->stmt ---->res
      

  5.   

    因为你的stmt和conn都是static的。第一次stmt基于conn生成,当第一次关闭conn时,你并没有关闭stmt,而且,你的create stmt的过程只判断了stmt是不是null,并没有判断它有效无效。你的commitData中只close了conn,并没有使stmt=null。所以第二次调用create stmt时,stmt并不为null,所以并没有重新create stmt,但是这个stmt所基于的conn已经被你关喽哇,所以报这个错了。
    你稍微修改下:    public static void releaseStatement(Statement stmt){
            try {
                if (stmt != null){
                    stmt.close();
                    stmt = null;
                }
            } catch (SQLException se){
                System.out.println("Close the statement encounter error!\n" + se.getMessage());
            }
        }
        public void commitData(){
            SingletonConnection sing = SingletonConnection.getInstance();
            Connection conn = sing.getConnection();
            //Statement stmt = sing.createStatement(conn);
            SingletonConnection.commitData(conn);
            SingletonConnection.printCount();
            SingletonConnection.releaseStatement(stmt); // 这个注释调的留着,用来关闭stmt
            SingletonConnection.releaseConnection(conn);
        }
      

  6.   

    正确的顺序是,先关闭resultset,然后关闭statement,然后关闭connection,不过只要你再关闭之前判断了是否为空就不那么重要了。
      

  7.   


    1.你的 SingletonConnection 单例模式写得没问题,但是newInstance得操作应该放在构造函数中。2.createStatement 和 releaseStatement 两个方法所处理的Statement对象不是同一个对象。
    当你调用releaseStatement 并清除传递过去的stmt时,并没有清空SingletonConnection 的成员变量stmt。
    你调用createStatement 方法,判断stmt 时条件if(stmt == null)始终是false!  每次数据库会话Statement都重新建立;不能利旧的
        public Statement createStatement(Connection conn){
            try{
                System.out.println("新建立的Statement");
                        count_stmt++;
                return conn.createStatement();
            } catch (SQLException e) {
                e.printStackTrace();
                return null;
            }
        }     protected SingletonConnection() {   
            try {
                Class.forName(DB_DRIVER); //指定JDBC数据库驱动程序
            }
            catch(java.lang.ClassNotFoundException e) {//捕获异常
                e.printStackTrace();
            }
        }    删除 private static Statement stmt = null; 对象 releaseStatement 方法    public String addHolidaysData(){
            //获取连接
            SingletonConnection sing = SingletonConnection.getInstance();
            Connection conn = sing.getConnection();
            //获取Statement
            Statement stmt = sing.createStatement(conn);
            try {
        stmt.executeQuery("select * from t_user");
    } catch (SQLException e) {
        e.printStackTrace();
    }
    sing.commitData(conn);
            stmt.close();
            sing.releaseConnection(conn);
            return null;
        }还是用连接池吧!
      

  8.   

    那关闭连接顺序是错误的。
    rs-stmt-conn
    从小到大。现在已经解决了。
    在我关闭连接时把 count_stmt初始化为0 ,当第二次请求时判断count_stmt是否=0 
    等于0时创建一个statement否则继续使用。