/************这是自己写的数据库连接类中的一个方法***************/
public static Connection getConn(){
try{
                           Class.forName(DRIVER);
Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/***************************/
问题:因为这个方法是静态的,是不是一旦获取连接实例conn,就不能关闭它(conn),因为下一次调用getConn(){方法时,
不会再创建conn。我说的对么?为什么呢?

解决方案 »

  1.   

    connection被关闭以后,是不是不为空,但是已经不能用了?
      

  2.   


    先不谈高级的运动比如数据库连接池之类。 一般获取类这里是用静态方法就使用单例模式。 你这里每次调用getConnection 都要去重新生成数据库链接,每次都要去加载驱动。所以消耗性能比较大。建议你这样写
    private static Connection conn  = null;public static Connection getConn(){
    try{
    if(conn == null){    //这样的话 如果conn里不为空则直接返回链接对象 而不需要再次去装载驱动并实例化Connection
     Class.forName(DRIVER);
     conn= DriverManager.getConnection(URL,USERNAME,PASSWORD);
    }
    return conn;
    }catch(Exception e){
    e.printStackTrace();
    return null;
    }
    }这个是基本的写法,你还是学生吧。
      

  3.   

    如果conn被关闭了,那么它也不为空,那么这个conn还能用吗?
      

  4.   


    言之差异。 这里说的基本写法是指公司开发的最基本的写法。和学校里学的基本写法不是一个层次的理念。学校学到的只是如何去实现功能。 而现实公司的要求是不光要实现功能还要讲究怎么样才能提高效率。可以说我上面提供的那个写法比你原始的写法效率能提高N倍。我那个基本写法是指Java23种设计模式里单例模式的基本写法。你如果毕业后从事Java开发工作的话。 这个模式不管在面试还是笔试90%会考到。
      

  5.   

    没有针对意义。说你上面的代码菜。没有像抨击你的意思。因为当我刚开始接触Java的时候我也是这样写的,所以现在看到你的写法,我就知道你也刚接触Java不久。 当你真正进公司做Java 不出1年,你再回头看你的这段代码,你就会理解我这句话的含义。 没有人身攻击,纯技术层面的想法。
      

  6.   

    这个看下来还是蛮适合你的要求的。
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;public class DBManager { private static DBManager dbm = null;
    // 用户名 private String user = ""; // 密码 private String password = ""; // 主机 private String host = ""; // 数据库名字 private String database = ""; // private DBManager dbm=null; /*
     * 
     * private String
     * url="jdbc:mysql://"+host+"/"+"useUnicode=true&characterEncoding=GB2312";
     */ private String url = ""; private Connection con = null; Statement stmt; /**
     * 
     * 私有的构造方法,确保外部不能实例化,只能由DBManager自己能提供自
     * 
     * 己的实例,并且只能有一个。
     * 
     * 根据主机、数据库名称、数据库用户名、数据库用户密码取得连接。
     * 
     * @param host
     *            String
     * 
     * @param database
     *            String
     * 
     * @param user
     *            String
     * 
     * @param password
     *            String
     */ private DBManager(String host, String database, String user, String password) { this.host = host; this.database = database; this.user = user; this.password = password; // 显示中文 this.url = "jdbc:mysql://" + host + "/" + database + "?useUnicode=true&characterEncoding=GB2312"; try { Class.forName("org.gjt.mm.mysql.Driver"); } catch (ClassNotFoundException e) { System.err.println("class not found:" + e.getMessage()); } try { con = DriverManager.getConnection(this.url, this.user,
    this.password); // 连接类型为ResultSet.TYPE_SCROLL_INSENSITIVE,
    // ResultSet.CONCUR_READ_ONLY stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); } catch (SQLException a) { System.err.println("sql exception:" + a.getMessage()); } } /**
     * 
     * 静态工厂方法,来获得一个DBManager实例
     */ public static DBManager getInstance(String host, String database,
    String user, String password) { if (dbm == null) { dbm = new DBManager(host, database, user, password); } return dbm; } /**
     * 
     * 返回取得的连接
     */ public Connection getCon() { return con; } /**
     * 
     * 执行一条简单的查询语句
     * 
     * 返回取得的结果集
     */ public ResultSet executeQuery(String sql) { ResultSet rs = null; try { rs = stmt.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } return rs; } /**
     * 
     * 执行一条简单的更新语句
     * 
     * 执行成功则返回true
     */ public boolean executeUpdate(String sql) { boolean v = false; try { v = stmt.executeUpdate(sql) > 0 ? true : false; } catch (SQLException e) { e.printStackTrace(); } finally { return v; } }}
      

  7.   

    首先,感谢sl514!我最开始就想问的终于出现了,这里构造方法里写了一句con = DriverManager.getConnection(this.url, this.user, this.password);我想问,这里的con是不是根本就不能关闭,如果关闭,是不是就再也得不到连接了,因为大家都知道构造
    方法只会调用一次,意思就是说只能得到一个con,所以我认为不能关闭con,对么?