JDBC | 第六章: JDBC連接資源的關閉和釋放


為什么需要釋放jdbc資源

提問:
Connection、Statement和ResulSet?這三個對象是在方法內部定義的,則這三個對象不是在方法執行完畢就消失了么,為什么還要單獨去關閉它們呢?
解答:
這個連接是與數據庫服務器的一個連接,雖然你的方法結束了,但是這個資源依然存在數據庫連接並沒有釋放
提問:
為什么在JDBC對數據庫訪問結束后,要按先關閉ResultSet,然后關閉PreparedStatement,最后關閉Connection,直接關閉Connection不就行了嗎?
解答:

  1. 感覺上好象是只要把connection給關閉了,系統就能正常運行了。 那在查詢或是其它操作中,如果只關閉Connection,不作ResultSet 和 Statement 的關閉的話,對系統性能是否會有影響呢。或者是其它實方面的不良影響。
    如果你不使用連接池,那么就沒有什么問題,一旦Connection關閉,數據庫物理連接就被釋放,所有相關Java資源也可以被GC回收了。 但是如果你使用連接池,那么請注意,Connection關閉並不是物理關閉,只是歸還連接池,所以PreparedStatement和ResultSet都被持有,並且實際占用相關的數據庫的游標資源,在這種情況下,只要長期運行,往往就會報“游標超出數據庫允許的最大值”的錯誤,導致程序無法正 常訪問數據庫

  2. 因為你打開的時候有順序,
    打開時:Connection -> PreparedStatement -> ResultSet
    關閉時:ResultSet-> PreparedStatement -> Connection
    這個就像 棧,后進先出

資源關閉代碼

//關閉數據庫的資源的順序最好與使用的順序相反
//數據庫連接(Connection)非常耗資源,盡量晚創建,盡量早的釋放
 //都要加try catch 以防前面關閉出錯,后面的就不執行了
    public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

完整項目案例
點擊這里 github


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM