2013-03-09 55 views
2

在我已經完成的一對.NET C#web服務項目中,我使用單例模式的幫助訪問了數據庫靜態。然後有一天,我的朋友告訴我這是一件壞事,因爲如果對同一個數據庫實體提出了很多請求,那麼該數據庫將因爲靜態實例而被鎖定。我的朋友是否正確?我認爲每一個新的請求都會創建一個新的類實例?訪問db static = bad?

單身類的實現看起來是這樣的:

public class WebService 
{ 
    private readonly IFactory _factory; 

    public WebService(IFactory factory) 
    { 
     _factory = factory; 
    } 

    public IDataRepository Data 
    { 
     get 
     { 
      return _factory.GetDatabase();  
     }    
    } 
} 

public static class WebServiceImpl 
{ 
    private static readonly WebService _webService = new WebShop(new WebserviceFactoryImpl()); 

    public static WebService webService { get { return _webService; } } 

} 

_factory.GetDatabase()返回數據庫類的新instace。

+0

這是什麼'IFactory'接口,特別是'GetDataBase()'做了什麼? – Yogu 2013-03-09 19:55:11

+0

它返回一個Database類的新實例。 – Poku 2013-03-09 20:47:14

回答

2

看着WebServiceImpl,所有的調用將共享一個WebService實例。現在,這不是必然一個問題,取決於如何實施;例如,如果_factory.GetDatabase();最終被調用了每個請求,那麼它可能是你越來越遠離它。進一步取決於GetDatabase()的作用 - 即它是否每個呼叫都得到一個新實例?還是每次都給你同樣的實例?簡單地說:我們沒有足夠的信息來充分回答。但是:

  • 在請求之間共享單個數據庫連接是危險的;要麼鎖定/同步,要麼冒着很多錯誤的風險(數據庫連接通常不會被寫成線程安全的)
  • 在請求之間共享一個ORM更糟糕:除了上面的所有內容外,您還會遇到以下問題數據積累在身份/對象緩存中; ORM實例(數據上下文等)旨在是短暫的,然後被丟棄(有時:設置)

具有靜態訪問到數據庫不一定是一個問題;這一切都歸結爲如何實現 - 例如,基於靜態的API仍然可以在每次調用時創建(並處置)連接。

+0

_factory.GetDatabase()返回一個Database類的新實例,它使用Entity框架(僅供參考)。所以我想我發佈的實施是好的畢竟? – Poku 2013-03-09 20:33:42

+0

@Poku如果它爲每個請求調用'GetDatabase()',並在'GetDatabase()'之前返回一個單獨的EF上下文,那麼你應該沒問題,是 – 2013-03-09 22:11:44

+0

它們被稱爲每個請求。謝謝你澄清這一點。 – Poku 2013-03-09 22:37:19