页面有多行数据。每行对应对条。是根据每行里的时间差计算出来的。例如:2010-01-01 到 2010-01-03 这就是3条数据,从1号到3号。
我页面有10行,那么数据最少有10条,也可能更多。
我用JS取出每行的内容,然后循环向后台提交(AJAX),这时后台执行的时候会出现 “关闭连接”的异常。
其实我就是想在开始插入时打开连接, 执行完毕 后提交数据,关闭连接。但总是出现“关闭连接” 这个异常
麻烦有过经验的给个解决办法。谢谢!

解决方案 »

  1.   

    。够散的。。 所谓的关闭连接异常是什么异常 可以详细的贴下么?
    前面用AJAX的调用的DD暂时可以无视
      

  2.   

    和ajax无关吧
    贴出你的jdbc代码和异常
      

  3.   

    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.addHolidaysData(HoliDaysOperImpl.java:201)
    at com.gmtoa.struts.sysManagement.holidays.action.HoliDaysOperAction.addHolidaysData(HoliDaysOperAction.java:105)
    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.doPost(ActionServlet.java:432)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    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)
      

  4.   


    //要返回的字符串
    String retStr = "";
    //拼接SQL
    StringBuffer buff = new StringBuffer();
    //获取连接,单例模式
    Connection con = SingletonConnection.getConnection();
    try {
    con.setAutoCommit(false);

    //获取Statement,单例模式
    Statement stm = SingletonConnection.createStatement(con);
    /**
     * sendStatus如果是send,则代表数据正在发送.还没有结束.
     * 继续添加.
     */
    if(sendStatus.equals("send")){ //按","转换为数组 
    String[] data = days.split(",");
    //取得起始时间与结束时间
    String begin_date = data[1];
    String end_date = data[2];
    //取得年
    String year = begin_date.substring(0, 4);
    //起始时间与结束时间的差
    int end_day = DateUtil.getBetweenDayNumber(begin_date,end_date,"yyyy-mm-dd");
    //循环添加
    for(int i=0;i<=end_day;i++){
    //计算从begin_date到i的日期
    String day = DateUtil.getNextDay(begin_date,String.valueOf(i)); //追加SQL
    buff.append("INSERT INTO holiday_work \n");
    buff.append("  (PARA_YEAR, \n");
    buff.append("   HOLIDAY_NAME, \n");
    buff.append("   HOLIDAY_TYPE, \n");
    buff.append("   HOLIDAY_DATE, \n");
    buff.append("   WORK_DAY_TYPE, \n");
    buff.append("   REMARKS) \n");
    buff.append("VALUES \n");
    buff.append("  ('"+year+"', \n");
    buff.append("   '"+data[0]+"', \n");
    buff.append("   '"+data[5]+"', \n");
    buff.append(" to_date('"+day+"','yyyy-mm-dd'), \n");
    buff.append("   decode('"+data[4]+"','1','+','2','-','3','-'), \n");
    buff.append("   '"+data[3]+"') \n");

    //打印添加SQL
    //System.out.println(buff.toString());
    //执行添加操作
    int state = 0;
    state = stm.executeUpdate(buff.toString());

    if(state == 0){
    retStr = "no";
    break;
    }else{
    retStr = "ok";
    }

    System.out.println("state = "+state);
    //清空buff对象
    buff.delete(0, buff.length());
    }

    con.commit();
    }
      

  5.   

    你的jdbc是hibernate管理还是spring
    如果是spring不需要显示关闭
      

  6.   

    Ajax循环的请求貌似不会按顺序执行
    恩  看不出什么问题
      

  7.   

    ajax提交的数据确实不是按顺序执行的
      

  8.   

    可以的话,请贴出你的SingletonConnection类,很可能是单例连接已经被关闭了???
      

  9.   


    public static Connection getConnection(){

    if(conn == null) {   
    try{
    newInstance();
    conn = DriverManager.getConnection(CONN_STR,USER_NBAME,PASSWORD);

    count_conn++;
    }catch(Exception ee){
    ee.printStackTrace();
    }
    }   
    return conn;   
    }

    public static Statement createStatement(Connection conn){
    try{
    if(stmt == null){
    stmt = conn.createStatement();
    count_stmt++;
    }
    return stmt;
    } catch (SQLException e) {
    e.printStackTrace();
    return null;
    }
    }
      

  10.   

    //获取连接,单例模式
            Connection con = SingletonConnection.getConnection();单例模式???????????????
      

  11.   

    没看到你关闭连接的代码在哪里呢。会不会是你每插入一条就关闭一次连接,但是你的连接时单例类,只有第一次是获得的是新的,插入第一条后被关闭了,但是 conn 不是 null,后面得到的连接都是这个关闭的 conn ,用它执行更新就出错。
      

  12.   

    既然数据格式都一样,为什么不用 addBatch 添加为批处理呢,添加完了再让数据库自己全部一起更新,应该就不会出现上条没发送完而后面又请求更新的情况了。
      

  13.   

    现在的写法不可取,事务中间大部分都去做准备字符串了。长事务。。在你的jdbc业务类和ajax之间加个适配接口吧,有点类型buffer的作用。相比较http请求(intranet),数据库操作还是要慢一些。适配接口专门接收请求字符串并按照格式拼装好,做好与jdbc业务类的同步操作就可以了
      

  14.   

    如果真的是这个原因的话那到好办了 将AJAX设置成非异步提交就可以了 这样他就不会在第一次提交结束前调用第二次提交了 LZ说自己用的是单例 但具体代码我并没有看 真是抱歉啊 如果说始终用的都是那一个CONNECTION对象的话 代码不如这样改改 if(conn == null || conn.isClosed()) {

    }
      

  15.   

    步骤 3 在IS机器的hosts文件中增加CM和Client主机信息。
    vi /etc/hosts
    在“hosts”文件中添加如下信息:
    10.137.3.234    BMP11
    10.137.3.236    BMP13
    10.137.3.231    BMP06
    10.137.3.233    BMP10
    10.138.3.109   china.ct.com
    在231、233、234、236主机上都执行相同步骤步骤 4 在本机上也配置主机信息
    C:\WINDOWS\system32\drivers\etc\hosts配置如下信息:
    10.137.3.234    BMP11
    10.137.3.236    BMP13
    10.137.3.231    BMP06
    10.137.3.233    BMP10
    10.138.3.109    t00141807.china.huawei.com