root cause java.sql.SQLException: ResultSet is closed
????????

解决方案 »

  1.   

    display.jsp用来从数据库中读取聊天内容.
      display
    </title>
    <meta http-equiv="refresh" content="10">
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head>
    <body bgcolor="#d6ebd6"  onload="scroller()">
    <%@page language="java" import="java.sql.*"%>
    <%@page  import="java.util.*"%>
    <%@page  import="java.util.Date"%>
    <jsp:useBean id="db" scope="page" class="reg_one.db" />
    <%
            String nickname="";
            String color=(String)session.getValue("color_write");
     
            Date m_date=new Date();
            String now_time=m_date.toLocaleString();
            long nowTime=m_date.getTime();
        //获得用户登录时间
        String nickName=(String)session.getValue("nickName");
            out.print(nickName);
    String chatRoom=(String)session.getValue("chatRoom");
            
    String sql="select logonTime from chatUser where nickName like '"+nickName+"'";
        
    ResultSet rs_1=db.executeQuery(sql);
             rs_1.next();
     
      
            //toLocateString 格式用于显示和保存到数据库
        long logonTime=rs_1.getLong("logonTime");
            m_date.setTime(logonTime);
            String logon_time=m_date.toLocaleString();
    rs_1.close();
            //组合查询
           //int i=0;
           sql="select * from chat where (secret=0 or chat_to='"+nickName+"' or chat_to='all' or chat_from='"+nickName+"') and (chatRoom='"+chatRoom+"') and (chat_time>#"+logon_time+"#) order by id asc";
           ResultSet rs_2=db.executeQuery(sql.);
     if(rs_2.next())
       {
                rs_2.afterLast();//这是每次我想显示10条记录
       rs_2.previous();
       int lab_last=rs_2.getRow();
       if(lab_last>10)
           {
          rs_2.absolute(lab_last-10);
    }
    else
       {
      rs_2.beforeFirst();
         
    }
    %><%   while(rs_2.next()) 
            {
              
              String chat_from=rs_2.getString("chat_from").trim();
              String chat_to=rs_2.getString("chat_to").trim();
              String chat_time=rs_2.getString("chat_time").trim().substring(11,19);
              String action=rs_2.getString("action").trim();
              String content=rs_2.getString("content").trim();
              int secret=rs_2.getInt("secret");   %>
          <input type="hidden" name="color" value=<%=color%>>
             <tr>
                <td><font color="#669966"><a href="send.jsp?name=<%=chat_from%>" target="mainFrame"><%out.print(chat_from);%></a>&nbsp;</font>
                    <font color="#FA85F4"> <%=action%></font>              对<font color="#ff0000">                       <%
                        if(chat_to.compareTo("all")==0)
                            {
                             %>
                              <a href="send.jsp?name=all" target="mainFrame">大家</a>
                            <%
                             }
                              else{
                             %>
                                <a href="send.jsp?name=<%=chat_to%>" target="mainFrame"><%=chat_to%></a></font>                         <%
                              }
                              if(secret==1)
                              {
                                 %>悄悄地
                                  <%}%>
                                  说:<font color=<%=color%>><%=content%></font>(<%=chat_time%>)
                                  </td>
                                  </tr><br>                           <%
                                }
                               rs_2.close();
               %>
                         <%
                       }
                          else
                           rs_2.close();
      %>
     
                               </table>                          </body>
                       </html>
       <%
          //刷新用户列表,首先获得在线的所有用户
         sql="select nickName ,chatTime from userlist";
         ResultSet rs_3=db.executeQuery(sql);
         while(rs_3.next())
         {
            //获得这个用户最后的发言的时间和现在的时间
            String checkUser=rs_3.getString("nickName").trim();
            long checkTime=rs_3.getLong("chatTime");
            //如果15分钟没有发言,则认为是发呆,从用户列表中汪除
            if(nowTime-checkTime>15*60*1000)
            {
               sql="delete from userlist where nickName like '"+checkUser+"'";
               db.executeDelete(sql);
               //在聊天室中显示该用户的离开信息
               sql="insert into chat (chatRoom,chat_from,chat_to,chat_time,action,content,secret)values('"+chatRoom+"','"+checkUser+"','all','"+now_time+"','*_*','886','0')";
               db.executeInsert(sql);        }     }
       //  rs_3.close(); %>
      

  2.   

    这样写代码,实在是太糟糕了。
    大体看了一下,以上错误发生的可能是这样
    不清楚你的reg_one.db这个类是怎么写的
    如果别的页面也用reg_one.db来执行sql,如果共享一个connection
    别的页面关闭了这个connection就会导致display.jsp中的结果集不可用。
      

  3.   

    不好意思,初学者吗?包含一下,reg_one.db里封装了对数据库的几个操作,查询,
    删除...代码如下:
       package reg_one;
    import java.sql.*;
    import java.sql.DriverManager;
    public class db{
      String sDBDriver="sun.jdbc.odbc.JdbcOdbcDriver";
      String sConnStr="jdbc:odbc:jsp_db";
      private Statement stmt=null;
      private Connection conn=null;
      ResultSet rs=null;
      public db() { 
       try{
         Class.forName(sDBDriver);
       conn=DriverManager.getConnection(sConnStr);
         Statement stmt=conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
          }
           catch(java.lang.ClassNotFoundException e)
       {
           System.err.println("db():"+e.getMessage());
        }
       catch(SQLException ex)
       {
             System.err.println("aq.executeQuery:"+ex.getMessage());
        }   
         }
       public ResultSet executeQuery(String sql){
          try{
             conn=DriverManager.getConnection(sConnStr);
             stmt=conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
             rs=stmt.executeQuery(sql);
           
           }
           catch(SQLException ex){
              System.err.println("aq.executeQuery:"+ex.getMessage());
           }
           return rs;
       }   public void executeInsert(String sql){
         try{
           conn=DriverManager.getConnection(sConnStr);
           Statement stmt=conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
           stmt.executeUpdate(sql);
           stmt.close();
           conn.close();
         }
         catch(SQLException ex)
         {
           System.err.println("sql_data.executerInset:"+ex.getMessage());
         }
          finally
            {         
             if(stmt!=null)
               stmt=null; 
             if(conn!=null)
               conn=null;
            }   
       }   public void executeUpate(String sql){
           try{
             conn=DriverManager.getConnection(sConnStr);
             Statement stmt=conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
             stmt.executeUpdate(sql);
             stmt.close();
             conn.close();
           }
           catch(SQLException ex)
           {
             System.err.println("sql_data.executerUpdate:"+ex.getMessage());
           }
           finally
              {
                       if(stmt!=null)
                         stmt=null;
               if(conn!=null)
                 conn=null;
                 }
       }   public void executeDelete(String sql){
        try{
          conn=DriverManager.getConnection(sConnStr);
          Statement stmt=conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE,   ResultSet.CONCUR_UPDATABLE);
          stmt.executeUpdate(sql);
          stmt.close();
          conn.close();
        }
        catch(SQLException ex)
        {
          System.err.println("sql_data.executerDelete:"+ex.getMessage());
        }
        finally
          {
           if(stmt!=null)
             stmt=null;
           if(conn!=null)
             conn=null;
             }
       }
       public void closeStmt(){
        try{
           stmt.close();
           }
        catch (SQLException e){
        e.printStackTrace();
         }
         }
       public void colseConn(){
        try{
        conn.close();
        }
        catch (SQLException e){
        e.printStackTrace();
        } 
       }
    }  这回整理了一下.谢谢你.
      

  4.   

    呵呵。最好的解决方法是重写你的数据库连接这个类。
    或者用别人的成熟的产品,比如连接池,比较稳定的如:JPool如果要在现在的基础上解决的话。应该是在调用结果集关闭的地方,就应该关闭这个连接
    colseConn()这个方法。如果别的jsp也会调用这个连接类的话。我也预测不到会发生什么
    事情了,逻辑比较混乱。colseConn()方法只是保证得到连接,关闭连接,跟结果集关闭保持
    一致性,我想应该可以。
      

  5.   

    那么,如果我偷机,COPY此类,换个名,然后,两个页面分别调用,是不互不景响呢>
      

  6.   

    我想也会出问题
    你先在调用结果集close的地方,就调用db的colseConn()方法试试
      

  7.   

    org.apache.jasper.JasperException: Unable to compile class for JSPAn error occurred at line: -1 in the jsp file: nullGenerated servlet error:
        [javac] Since fork is true, ignoring compiler setting.
        [javac] Compiling 1 source file
        [javac] Since fork is true, ignoring compiler setting.
        [javac] C:\Tomcat 5.0\work\Standalone\localhost\regapp\chat\display_jsp.java:98: cannot resolve symbol
        [javac] symbol  : method closeConn ()
        [javac] location: class reg_one.db
        [javac]         db.closeConn();
        [javac]           ^
        [javac] C:\Tomcat 5.0\work\Standalone\localhost\regapp\chat\display_jsp.java:189: cannot resolve symbol
        [javac] symbol  : method closeConn ()
        [javac] location: class reg_one.db
        [javac]  db.closeConn();
        [javac]                                                           ^
        [javac] C:\Tomcat 5.0\work\Standalone\localhost\regapp\chat\display_jsp.java:198: cannot resolve symbol
        [javac] symbol  : method closeConn ()
        [javac] location: class reg_one.db
        [javac]   db.closeConn();
        [javac]     ^
        [javac] C:\Tomcat 5.0\work\Standalone\localhost\regapp\chat\display_jsp.java:227: cannot resolve symbol
        [javac] symbol  : method closeConn ()
        [javac] location: class reg_one.db
        [javac]      db.closeConn();
        [javac]        ^
        [javac] Note: C:\Tomcat 5.0\work\Standalone\localhost\regapp\chat\display_jsp.java uses or overrides a deprecated API.
        [javac] Note: Recompile with -deprecation for details.
        [javac] 4 errors这是为何???
      

  8.   

    org.apache.jasper.JasperException
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:370)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:293)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:240)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)root cause java.lang.NullPointerException
    at reg_one.db.closeStmt(db.java:102)
    at org.apache.jsp.display_jsp._jspService(display_jsp.java:222)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:136)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)什么原因.
      

  9.   

    下载那个jpool 扩展名是那一个.怎么用,可不可以在线教我.
      

  10.   

    你在关闭数据库连接是出错了
    NullPoint错误