请教各位我在javabean里有一个类里写了个关闭连接的函数public void Close() {
    try {
      stmt.close();
      conn.close();
      if (conn.isClosed()) {
        System.out.println("已关闭");
      }
      else {
        System.out.println("未关闭");
      }
    }
    catch (SQLException e) {
      e.printStackTrace();
    }
  }每次运行打印的都是已关闭但是我在cmd下用netstat -an后还是发现大量的127.0.0.1连接,请问这是怎么回事?

解决方案 »

  1.   

    Close()中要传两个参数吧Close(stmt,conn)
      

  2.   

    没错肯定是web链接mysqltcp    127.0.0.1:1088   127.0.0.1:3306    established
    ...........................
    很多这种链接
      

  3.   

    这个close()方法是他自己自定义的.不是类库中的.
    类库中的close()方法也是根据对象不同的.
      

  4.   

    stmt conn 是在构造函数里实例的CLose()是本类中的一个函数
      

  5.   

    我把执行流程给各位描述一下package ediam.data;import java.sql.ResultSet;
    import java.sql.Connection;
    import java.sql.Statement;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.ArrayList;public class DataLink {
      private Connection conn;
      private ResultSet rs = null;
      private Statement stmt;
      private ArrayList list;
      private int i;
      private boolean bool = false;
      private String back = "";
      private String user = "aaa";
      private String pass = "aaa";  public DataLink() {
        try {
          Class.forName("com.mysql.jdbc.Driver").newInstance();
        }
        catch (ClassNotFoundException classnotfoundexception) {
          System.err.println("error: " + classnotfoundexception.getMessage());
        }
        catch (Exception ex) {
          System.err.println("error:  " + ex.getMessage());
        }
        try {
          conn = DriverManager.getConnection(
              "jdbc:mysql://localhost:3306/aaa?useUnicode=true&characterEncoding=GBK",
              user, pass);
          stmt = conn.createStatement();
        }
        catch (SQLException e) {
          e.printStackTrace();
        }
      }  public String executeUpdate(String sql) {
        rs = null;
        back = "";
        try {
          stmt.executeUpdate(sql);
        }
        catch (SQLException ex) {
          ex.printStackTrace();
          back = ex.toString();
        }    return back;
      }  public void Close() {
        try {
          stmt.close();
          conn.close();
          if (conn.isClosed()) {
            System.out.println("已关闭");
          }
          else {
            System.out.println("未关闭");
          }
        }
        catch (SQLException e) {
          e.printStackTrace();
        }
      }
    }web页面请求调用executeUpdate执行更新,在没有操作后执行由jsp页面调用Close()
      

  6.   

    你把mysql的服务停了之后看以下连接?
      

  7.   

    我看了一下,我的也有,个人理解
    tcp    127.0.0.1:1088  127.0.0.1:3306    established 表示已经连接过了,并不能说明此连接没有关闭吧
      

  8.   


    如果在运行期间停掉mysql,显示如下127.0.0.1:1088   127.0.0.1:3306   Close_wait
    ...........
    显示关闭中
      

  9.   

    可是established 的意思是建立连接。表示两台机器正在通信中。而且如果运行一个网站,有一次请求就产生一个链接,那如果同时在线很多人,并且同时发送很多请求的话,那端口也不够用啊
      

  10.   

    代码改了一下,我没有找到你调Close()方法,所以估计是没有调用的错,而且Close()方法中也没有关闭rs.
    另外说几点题外的问题:
    第一,Close()方法名首字母大写问题.格式是应该注意的.
    第二,方法封装不好,为了重用性,需要把方法的各种功能分开来,同一种的功能,我们使用方法重载进行封装.
    package ediam.data; import java.sql.ResultSet; 
    import java.sql.Connection; 
    import java.sql.Statement; 
    import java.sql.DriverManager; 
    import java.sql.SQLException; 
    import java.util.ArrayList; public class DataLink { 
      private Connection conn; 
      private ResultSet rs = null; 
      private Statement stmt; 
      private ArrayList list; 
      private int i; 
      private boolean bool = false; 
      private String back = ""; 
      private String user = "aaa"; 
      private String pass = "aaa";   public DataLink() { 
        try { 
          Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        } 
        catch (ClassNotFoundException classnotfoundexception) { 
          System.err.println("error: " + classnotfoundexception.getMessage()); 
        } 
        catch (Exception ex) { 
          System.err.println("error:  " + ex.getMessage()); 
        } 
        try { 
          conn = DriverManager.getConnection( 
              "jdbc:mysql://localhost:3306/aaa?useUnicode=true&characterEncoding=GBK", 
              user, pass); 
          stmt = conn.createStatement(); 
        } 
        catch (SQLException e) { 
          e.printStackTrace(); 
        } 
      }   public String executeUpdate(String sql) { 
        rs = null; 
        back = ""; 
        try { 
          stmt.executeUpdate(sql); 
        } 
        catch (SQLException ex) { 
          ex.printStackTrace(); 
          back = ex.toString(); 
        } finally {
          close(rs);
          close(stmt);
          close(conn);
        } 
         
        return back; 
      }   public void close(ResultSet rs) throws Exception { 
        if(rs == null) rs.close();
      }   public void close(Statement stmt) throws Exception {
        if(stmt == null) stmt.close();
      }
      
      public void close(Connection conn) throws Exception {
        if(conn == null) conn.close();
      }

      

  11.   

    那个通信对服务器端而言使用的是一个端口,不会有多个端口出现的,如果有多个端口你怎么确定访问的url?
    这方面看看socket api.
      

  12.   


    调用Close是由jsp页面通过jsp:useBean来执行的关闭,如果按照您那样写,会不会出现每调用一次update函数就会新关闭一次连接?而一个jsp页面内可能反复执行多个操作,那就会关闭很多次?
      

  13.   


    我观察过cmd窗口的变化,每执行一个jsp页面的时候会出现10个左右这样的链接,如果打开的页面多,连接也随之增多,而且并不会隔一段时间自动消失(我观察了一个20多分钟仍然存在)那么可能就会有这样一种情况,当客户端访问数量多的时候,就会不停的在cmd里出现这些,不停?
      

  14.   

    如果这样的话,你可以考虑使用OpenSessionInView
      

  15.   

    要下了,你可以自己揣摩一下,但是推荐不要把这种细致的问题当成重点花太多时间,如果要想学到知道java所有的细节,那岂不是神人?