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