搜尋此網誌

2012/04/27

多執行緒環境下之資料庫存取

多執行緒環境下之資料庫存取

同步化 + Singleton Design Pattern

    存取資料庫是相當耗時的工作,不論是建立連線或做大量資料運算,這些工作皆
遠較單純在程式中運算耗費更多的時間。所以我們有時會想以新的執行緒去處理一些
工作,或是將資料處理在背景中執行。這樣雖然方便,但是也因而產生了一些新的問
題。

    我們知道資料庫中有許多動作(尤其是 Modify)是不允許同時操作的,例如在同一
個時間就不可能由兩個以上的使用者更改同一個表格的同一筆記錄。現在若是我們產
生多個執行緒去異動資料庫,則我們很可能遇到以上的狀況,因而在此提供一種解決
架構。


    在此所提出的解決方式就是同步化(Synchronized)各執行緒對資料庫的存取。我
們可以定義一個共同的介面,所有執行緒皆透過此介面對資料庫存取,而此介面的責
任有二:
  1. 使用 Singleton Design Pattern 實作,也就是永遠保持一個 instance。因為 若是產生多個 instance 則將無法做到同步化。
  2. 同步化(Synchronized)各執行緒對資料庫的存取。
其示意圖如下: Thread1 Thread2 ThreadN | | | | | | o1:SomeObject o2:SomeObject oN:SomeObject | | | | | | ------------------------------------------------- DatabaseFacade ------------------------------------------------- | | Database 要實作出 Singleton 非常容易,以 Java(TM) 為例,只要將所有數建構子宣 告為 private ,而且至少提供一個建構子(防止編譯器提供預設建構子)。然後提 供一個類別(靜態)方法,例如 getInstance() 以供外界取得物件。 程式範例如下: <span style="font-family: Courier New, Courier, monospace;">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 } }</span><span style="font-family: arial;"> </span>

沒有留言: