簡體   English   中英

調試時沒有關閉數據庫連接的問題?

[英]Problem with not closing db connection while debugging?

我有一個Java應用程序,它在開始時打開與數據庫的連接,並在最后關閉它。 但是,程序並不總是完成,因為拋出異常或我正在調試它並在中途停止它。

這是否會導致打開連接以堆積和減慢數據庫速度,還是會自動清理?

數據庫連接由數據庫擁有和管理,該類只允許您訪問該數據庫資源。 如果不關閉連接,那么Java類可能被垃圾收集,但數據庫可能無法告知連接不再使用,這可能導致數據庫資源被浪費(直到數據庫端超時) )甚至泄漏。

因此,當您完成使用Connection ,應確保通過調用close()方法顯式關閉它。 這將允許垃圾收集器盡可能早地重新收集內存, 更重要的是 ,它釋放連接可能保留的任何其他數據庫資源(游標,句柄等)。

傳統的方式在Java中做到這一點是關閉ResultSetStatement ,以及Connection (按順序)在finally塊當你與他們所做的和安全模式看起來像這樣:

Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;

try {
    // Do stuff
    ...

} catch (SQLException ex) {
    // Exception handling stuff
    ...
} finally {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) { /* ignored */}
    }
    if (ps != null) {
        try {
            ps.close();
        } catch (SQLException e) { /* ignored */}
    }
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) { /* ignored */}
    }
}

finally塊可以略微改進(以避免空值檢查):

} finally {
    try { rs.close(); } catch (Exception e) { /* ignored */ }
    try { ps.close(); } catch (Exception e) { /* ignored */ }
    try { conn.close(); } catch (Exception e) { /* ignored */ }
}

但是,這仍然非常冗長,因此您通常最終使用輔助類來關閉null安全幫助程序方法中的對象,並且finally塊變為類似:

} finally {
    DbUtil.closeQuietly(rs);
    DbUtil.closeQuietly(ps);
    DbUtil.closeQuietly(conn);
}

實際上, Apache Commons DbUtils有一個DbUtils類,它正是這樣做的,所以不需要編寫自己的類。

在您的情況下,這將解決異常的問題,但不會解決調試問題(並且您將浪費數據庫資源,直到數據庫端發生超時)。 所以1.不要使用生產數據庫調試代碼2.嘗試執行調試會話直到結束。

這是Sun(錯誤...... Oracle?) 所說的

建議程序員明確關閉不再需要的連接和語句。

程序員用Java編程語言編寫代碼而不使用任何外部資源不需要擔心內存管理。 垃圾收集器在不再使用時自動刪除對象並釋放它們正在使用的內存。 當內存不足時,它將回收丟棄的對象,使它們當前占用的內存可用於快速重用。

但是,如果應用程序使用外部資源,就像它使用JDBC API訪問DBMS時一樣,垃圾收集器無法知道這些資源的狀態。 它仍將回收丟棄的對象,但如果Java堆中有大量可用內存,即使(少量)Java垃圾持有大量昂貴的數據庫資源,它也可能不經常收集垃圾。 因此,建議程序員在不再需要時立即關閉所有連接(使用方法Connection.close)和語句(使用方法Statement.close),從而盡可能早地釋放DBMS資源。 這尤其適用於旨在與不同DBMS一起使用的應用程序,因為從一個DBMS到另一個DBMS的變化。

我將數據庫訪問放在try塊中,並確保關閉finally塊中的所有語句和連接。

您的數據庫服務器將具有超時設置。 它將關閉連接並回滾任何未提交的事務。 對於任何具有生產能力的db產品,這種情況已經發生了數十年。

如果你想正確使用try {..你的代碼..}最后{..close connections ..}

不。

如果您的程序繼續並且您的連接仍然存在,則BD只是拒絕您的判決。

如果您的連接發生了某些事情(例如,超時),那么BD就是關閉了該連接並且不消耗資源的人。

如果您釋放了連接,並且調用了垃圾收集器(可能需要一段時間),連接將在釋放之前自行關閉。

如果您的程序在未關閉連接的情況下終止,那么所有(操作系統)進程將釋放其本機資源,以及它們之間連接到BD的本機資源(可能是網絡套接字)。 然后,BD將接收中止/關閉的連接並釋放您的連接。

唯一可能發生的事情是,只有一次執行會多次連接到BD並且做一些非常糟糕的事情讓它們保持打開狀態,使所有連接都可用。 但我認為這不是你的情況。

編輯 :一般來說,BD是壞客戶端行為的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM