2012-04-18 50 views
0

我當前的設計模式在單個便利類中包含大量數據庫訪問方法。當它被實例化時,它抓住它需要的連接並等待方法。便捷類中的關閉連接

這是我的想法,打開一個單一的連接,當我要運行10個方法與該連接將比打開和關閉10個單獨的方法中的每一個更好。

但是,我意識到我不關閉任何這些連接。我得出的結論是,我必須返回並重構所有對該方法的調用,以包含將釋放所有活動連接的方法closeConnections

我的問題是這樣的: 我應該打開並在每一個方法有着密切的聯繫,遵循良好的設計實踐(將在招致顯著的開銷),或者我應該重構爲一個closeConnections方法調用與調用方便的類

僞碼

class convenience{ 
    public contructor(){ 
     a = new Connection(); 
    } 

    public void methodA(){ 
     /* do stuff */ 
    } 
    public void methodB(){ 
     /* do stuff */ 
    } 
    public void methodC(){ 
     /* do stuff */ 
     //should I do this? 
     a = new Connection(); 
     /* do stuff */ 
     a.close(); 
    } 
    public void close(){ 
     //or this 
     a.close(); 
    } 
} 
+0

在進行便捷方法調用時可以傳遞連接對象嗎? – 2012-04-18 18:18:30

+0

這是我最初的設計實現。我有一個單一的連接,在所有的班級之間共享,真正被濫用。我用需要的基礎上打開/關閉連接取代了這種連接,以抵制網絡中斷。 – EricR 2012-04-18 18:20:53

回答

1

也許你不應該保持這種便利類的連接,而是通過它在每個方法調用。這樣您就可以控制連接的生命週期,並且 - 例如 - 以有用的方式使用事務。

將此連接保留在此便利級別內會增加與多個線程共享連接的風險,這通常不可取。

通過使用像c3p0,DBCP,BoneCP(和其他)這樣的連接池,可以緩解/刪除打開和關閉連接的成本。

+0

我實現了它,使便利類相當簡單,並根據需要創建新實例以避免共享連接(這個問題是否會持續存在?我不知道這裏)。我一直打算查找連接池。這是個好主意。 – EricR 2012-04-18 18:28:15

0

我建議,只要你打開一個連接,你應該註冊一個服務。然後,您可以稍後檢查該服務,以確定該特定連接是打開還是已關閉,以便在應用程序中發現泄漏。

0

遵循良好的設計實踐

如果你想要的話就不會重新發明輪子。使用connection pool

+0

我以前沒有用過連接池。這是我必須在每次實例化便利類時實例化一個連接,還是我將保留單個實例並傳遞給便利類的每個實例化? – EricR 2012-04-18 18:29:59

+0

簡而言之,您從一個池中獲得一個連接並將其返回到池中(通過明確關閉連接)。所有其他細節都由池處理。您只需使用連接。根據您如何訪問池例如,你可以有一個'DataSource'並在所有對象中重用它以從'DataSource'獲得連接。 – Cratylus 2012-04-18 18:32:31

+0

很高興知道。乾杯。 – EricR 2012-04-18 18:38:44