问题可能出在lwdb对象上,也许它在每次执行sql的时候都新开连接,次数一多就超过数据库允许的连接数了,这种情况你关resultset是没用的。

解决方案 »

  1.   

    to bjzhanghao
    你这里所说的新开连接指的是新开statement吗?
    这个类是一个朋友给我用的,关于这个类的代码如下:
    package unistock;import javax.swing.JComponent;
    import java.sql.*;
    import javax.swing.JWindow;
    import javax.swing.JComponent;
    import java.net.*;
    import java.lang.*;
    import java.io.*;
    import java.util.*;
    import com.borland.dx.sql.dataset.*;public class LWDBoperator extends JComponent {
      private String UserName="root";
      private String PWD="";
      private String url ;
      private Connection con;
      private Statement stmt;
      private ResultSet rs = null;
     // private Database database1 = new Database();  public   LWDBoperator(){
        try {
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }
       catch(java.lang.ClassNotFoundException e){
         System.err.println("sun.jdbc.odbc.JdbcOdbcDriver " + e.getMessage());
        }
        catch(Exception e) {
          e.printStackTrace();
        }  }
    //////////////////////////////
    ///返回mysql 连接,connection
    /////////////////////////////
      public   Connection  Connect(String dbname){
        try{
          url="jdbc:odbc:"+dbname;
          con=DriverManager.getConnection(url);
        //stmt= conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
          System.out.println("db connect success");
          return con;
        }
        catch(Exception e){
          System.err.println("db connect err"+e.getMessage());
          return null;
        }
     }
    //////////////////////////////////
    ///关闭连接
    /////////////////////////////////
      public void close(){
        try{
          con.close();
          System.err.println("db colse success");
        }
        catch(Exception e){
          System.err.println("db colse err"+e.getMessage());
        }
      }
    /////////////////////////////////////////////
    // 用于进行记录的查询操作,用于select 语句。
    //参数:sql语句,
    //返回:ResultSet对象
    ///////////////////////////////////////////
      public ResultSet executeQuery(String sql) {
        try {
          stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
          //System.out.print("sqlis :||"+sql+"||");
          rs = stmt.executeQuery(sql);
          return rs;
        }
        catch(SQLException ex) {
          System.err.println("db.executeQuery: " + ex.getMessage());
          return null;
        }
      }
    //////////////////////////////////////////////
    //用于进行add或者update,insert,del等的记录的操作,
    //入口参数:sql语句
    //返回 :true,false
    //////////////////////////////////////////////
        public boolean executeUpdate(String sql) {
          boolean bupdate=false;
          try {
            stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            int rowCount = stmt.executeUpdate(sql);
            if (rowCount!=0) bupdate=true;
          }
          catch(SQLException ex) {
            System.err.println("db.executeUpdate: " + ex.getMessage());
          }
          return bupdate;
      }
      //////////////////////////////////////////////
    //用于进行表结构的操作,creat drop,modify等。
    //入口参数:sql语句
    //返回 :true,false
    //////////////////////////////////////////////
        public boolean executeTable(String sql) {
          boolean bupdate=false;
          try {
            stmt= con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            System.out.print("对表的操作的 sqlis :||"+sql+"||");
            stmt.executeUpdate(sql);
            bupdate=true;
          }
          catch(SQLException ex) {
            System.err.println("db.executeTable: " + ex.getMessage());
          }
          return bupdate;
      }
      //////////////////////////
      //返回数据库的信息
      //////////////////////////
        public Statement getLWPAIDStatement(){
            try{
              return con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
            }
            catch(java.sql.SQLException e){
               System.err.println("getAISPStatement():"+e.getMessage());
               return null;
            }
        }    public DatabaseMetaData getLWPAIDMetaData(){
            try{
               return con.getMetaData();
             }
            catch(java.sql.SQLException e){
               System.err.println("getAISPMetaData():"+e.getMessage());
               return null;
             }
        }
    }
      

  2.   

    你试试在executeQuery方法返回rs以前加上stmt.close()
    可能吧,如果是这个问题的话,在executeUpdate方法也类似处理
      

  3.   

    不能加啊!
    加上去后好象rs就无法被return了!
    结果集为空
      

  4.   

    给你提个建议 没有合适的环境给你测试了 只供参考   你的rs.close() 是有用的 但是 你为什么没有调用 LWDBoperator 的close() 来关闭con 呢? 你调用了LWDBoperator的 executeQuery(String ) 方法 使 它的con 保持了连结 却没有再关闭这些连结!!!!
      

  5.   

    下面是从数据库里提取用户的ID和密码进行验证,如果先关掉stmt,那么结果总是返回
    No such customID ....   也就是rs里没有记录!
    void btnEnter_actionPerformed(ActionEvent e) {
          String customID = jTCustomID.getText();
          String password = new String(jPassField.getPassword());
          if(customID != null&&password != null){      int i=-1;      lwdb.Connect("Stock");
                try{
            ResultSet rs = lwdb.executeQuery("SELECT Password FROM Person WHERE customID = "+customID);        boolean more = rs.next();
                while(more){
                if(password.equalsIgnoreCase(rs.getString("Password"))){
                  i+=1;
                }
                more = rs.next();
              }
            //con.close();
          }catch(Exception ex){
            System.err.println(ex.getMessage());
          }      if(i>=0){
            System.out.println("Enter successfully!");
            Frame2 frame2 = new Frame2();
            frame2.show();
            this.dispose();
          }else{
            System.out.println("No such custom!Please check your customID and Password!");
            jTCustomID.setText("");
            jPassField.setText("");
            jTCustomID.grabFocus();
          }
      }else{
        System.out.println("Please enter customID and password!");
        return ;
      }
    }
      

  6.   

    关键是在每次对数据库操作后(你是否调用了 LWDBoperator 的 close() 方法(谁叫你不用连结池呢)) 具体的位置 你应该根据你的业务逻辑 仔细的考虑后 自行决定位置如果Connection 的 连结不关闭 数量大了后 一定会出问题的!!!!!
      

  7.   

    to: qxjavajava(射手座 =--->听歌看海)
    我从数据库里提取出customID然后加到JList里去,然后当选中其中某个customID时
    旁边的JtabbedPane里就出现这个custom的信息,
    如果每个valuechanged事件都要触发一次对数据库的连接,那样太麻烦
    我想要的效果是在操作JLIST时只连一次,每次只是重复地使用lwdb.executeQuery(sql)
    select各个customID对应的信息
      

  8.   

    我都说了..
    每次操作底时候:
    1.连接connect()
    2.执行sql.....
    3.关闭rs.close()
    4.关闭数据库connect..close()如果需要下面一个连接就重复上面的动作...
    否则..你肯定是不可以的...哥们!!!
      

  9.   

    可以的话,你还是使用连接池吧。这样你的问题都解决了。而且conn.close()一执行,所有的stmt和rs都关闭了。另外,JDBC-ODBC bridge driver的性能也不太好,数据量一多是会有问题的。