多執行緒環境下之資料庫存取
同步化 + Singleton Design Pattern
存取資料庫是相當耗時的工作,不論是建立連線或做大量資料運算,這些工作皆
遠較單純在程式中運算耗費更多的時間。所以我們有時會想以新的執行緒去處理一些
工作,或是將資料處理在背景中執行。這樣雖然方便,但是也因而產生了一些新的問
題。
我們知道資料庫中有許多動作(尤其是 Modify)是不允許同時操作的,例如在同一
個時間就不可能由兩個以上的使用者更改同一個表格的同一筆記錄。現在若是我們產
生多個執行緒去異動資料庫,則我們很可能遇到以上的狀況,因而在此提供一種解決
架構。
在此所提出的解決方式就是同步化(Synchronized)各執行緒對資料庫的存取。我
們可以定義一個共同的介面,所有執行緒皆透過此介面對資料庫存取,而此介面的責
任有二:
- 使用 Singleton Design Pattern 實作,也就是永遠保持一個 instance。因為
若是產生多個 instance 則將無法做到同步化。
- 同步化(Synchronized)各執行緒對資料庫的存取。
其示意圖如下:
Thread1 Thread2 ThreadN
| | |
| | |
o1:SomeObject o2:SomeObject oN:SomeObject
| | |
| | |
-------------------------------------------------
DatabaseFacade
-------------------------------------------------
|
|
Database
要實作出 Singleton 非常容易,以 Java(TM) 為例,只要將所有數建構子宣
告為 private ,而且至少提供一個建構子(防止編譯器提供預設建構子)。然後提
供一個類別(靜態)方法,例如 getInstance() 以供外界取得物件。
程式範例如下:
public class SingletonImpl {
// Hold the instance reference.
private static SingletonImpl impl;
public static getInstance() {
if (impl == null)
impl = new SingletonImpl();
return impl;
}
// Prevent external class to create SingletonImpl
// instance directly.
private SingletonImpl() { // Do nothing }
}
沒有留言:
張貼留言