天天看點

Connection的close和null的問題

BaseDao中擷取Connection的方法

public Connection getConn() {
        try {
            if(null == conn) {
                conn = db.getConnection();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
           

在平時的練習中一個Service中隻調用一次dao操作,是以該方法的問題沒有被發現;

這裡的問題是CURD操作後的conn.close(), 隻是做連接配接資料庫資源的釋放,記憶體對象還會存在也就是close後conn!=null,當第二次調用給方法是,會直接傳回被釋放連接配接的conn,到此第二次通路資料庫是報SQLException Connection is closed異常

改正之後

//1.
public Connection getConn() {
        try {
            if(null == conn || conn.isClosed()) {
                conn = db.getConnection();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
//2. 
@Override
    public void close() {
        if(conn != null) {
            try {
                conn.close();
                conn = null;              //~~~~
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
在釋放連接配接close後網上提供說法是把conn=null;也可以避免以上的問題,以及重複關閉資源的問題