簡體   English   中英

關閉分配的實例變量

[英]Closing assigned instance variable

我正在使用Java和數據庫。 我有一個連接類PgConnection,在這個類中,我有一個私有的連接變量

private Connection Con = null;

在構造函數中創建Connection

Properties props = new Properties();
    props.load(Thread.currentThread().getContextClassLoader()
            .getResourceAsStream("database.properties"));

    String url = props.getProperty("db.url");
    String user = props.getProperty("db.user");
    String passwd = props.getProperty("db.passwd");

    Class.forName("org.postgresql.Driver");
    this.con = DriverManager.getConnection(url, user, passwd);

當在我的代碼中使用這個con變量時,我一直在通過將其分配給函數內的局部變量來引用它Connection conn = this.con;

這是正確的做法嗎? 如果是這樣,我是否應該在退出函數之前關閉conn 完成PgConnection的特定實例后,我就有一個Close()方法來關閉this.con

謝謝

當然,如果在打開連接的同一方法中關閉連接,則安全得多,而且操作起來也更容易,因為這樣您的方法就可以控制數據庫連接的生命周期。 如果可能的話,您的方法應始終使用try-with-resources語句 ,以確保即使在發生異常的情況下也可以關閉連接:

public void performDatabaseOperation(...) {
    // initialize properties here, load driver etc. here

    try (Connection con = DriverManager.getConnection(url, user, pwd)) {
        // use connection.
        // it will be closed automatically at the end of this code block
        // even if exceptions occure!
    }
}

當然,如果您希望對調用代碼進行更多控制,則可以使用上述方法將連接打開與關閉分開。 但是請記住,這將導致狀態以及調用代碼無法正確/在正確的時間點close的危險。

當您的API提供幾種對數據庫進行操作並且可以按任意順序調用的方法時,您可能必須給調用者提供生命周期控制的一個示例,並且所有操作應在同一事務內/使用同一連接運行。

只需考慮一下在您的個別情況下使用兩個單獨的方法open()close()相反的優點,即只使用一個perform()方法。 如果沒有,請保持簡單!

是的,您需要每次都關閉連接,除非它具有持久性單元連接。 基本上,您可以編寫一種方法來獲取任何操作的數據庫連接,並且應該在放置數據庫相關內容的方法內部關閉連接。

請參閱此鏈接以獲取更多信息。

如果在退出方法之前關閉本地conn ,則本地conn引用的原始Connection實例con也將被關閉,並且您無法使用該連接進行任何進一步的操作。

要考慮的主要點是,此處conncon指的是同一Connection實例。

暫無
暫無

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

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