2012-01-14 39 views
1

是的,我知道..除非我有義務,否則我不會這樣做單連接方式。JDBC Singleton final文件解析的連接變量

說了這麼多,假設我想用一個sql連接變量創建一個單例類,比如說DBConnection,並且讓我們說我想讓這個類從關於數據庫ip,用戶等文件的信息中加載它的構造函數。

如何將Connection變量設置爲最終靜態,如果在分配值之前需要先從文件解析數據?

到目前爲止的代碼(忽略的getConnection丟失同步):

final public class DBConnection { 
    transient private static Connection con; 

    private DBConnection() 

     [parse file, make url] 
      con = DriverManager.getConnection(url); 
     [...] 
    } 

    public static Connection getConnection(){ 
     if (con == null) 
     new DBConnection(); 

    return con; 

    } 
} 

另外,請告訴我們,如果有什麼尷尬的類,單明智的。 從某種意義上說,也許我不應該把它當作final來處理,如果連接關閉了,我必須做一個新的getConnection,但那可能是一個不好的單例類,不是嗎?

編輯決定改變我的形式給出,並使其成爲枚舉的方式

public enum Connect { 
    INSTANCE; 
    private Connection con; 
    Connect(){ 
     [parse file] 
     con = DriverManager.getConnection(url); 
    [...] 
} 

public Connection getCon(){ 
    return con; 
} 

但是,我怎麼確保沒有人試圖

Channel.INSTANCE.getCon

構造函數完成之前的

回答

0

如果調用了Connect.INSTANCE.getCon(),那麼必須構造INSTANCE枚舉,那麼它的構造函數必須先前已經被執行。如果構造函數以前沒有被執行過,那麼這樣的代碼就不可能被執行。

+1

我有點擔心getCon被第二個線程訪問,而第一個線程正在開始構造函數,看起來實例已被分配。 (請參閱http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html上的Symantec JIT測試:「單身人員[i] .reference的分配在Singleton的構造函數被稱爲」 ,雖然我不太確定這種情況是否可以應用於enum – Bimp 2012-01-14 17:42:18

+0

枚舉是線程安全的。不用擔心。 – 2012-01-14 18:17:31

+0

我明白了,謝謝。 – Bimp 2012-01-14 19:28:19