2012-11-23 104 views
0

我已經閱讀了關於單例示例的幾篇文章。我可以看到開發人員有時將數據庫連接對象或連接管理器作爲單例實現。在一些帖子中,甚至建議使用數據庫連接池。 單身人士意味着創建一個單一的實例,所以基本上我們限制了訪問。例如打印機或硬件訪問,記錄器訪問,我們試圖限制用戶訪問一個單一的訪問。然而,在數據庫連接對象中使用單例的目的是什麼? 如果我能理解正確地創建數據庫連接作爲單例意味着應用程序服務器將只有一個實例。這是否意味着只有一個用戶可以訪問數據庫連接,下一個用戶必須等到連接關閉? 請指教。爲什麼數據庫連接對象或連接池需要單身?

回答

2

我認爲你正確理解了使連接本身成爲單例的含義。一般來說這不是一個好主意(儘管在某些特殊情況下它可能是有意義的)。

使連接管理器或連接池成爲單例完全不同。池本身會處理一系列連接,並且可以根據需要創建新的(最大限度)或重新使用已經使用和丟棄的連接。

有在同一時間幾個連接池將失去池的優點:

  • 這將是更難控制連接打開
  • 一個池可以創建連接的總數,而其他可能有連接可用

希望這有助於澄清這個問題。您可能想了解更多關於連接池的信息。

+1

有一件值得注意的事情,對於連接池是一個「邏輯單例」(即每個數據庫/用戶只有一個實例),這正是此處所述的原因。但實際上作爲單例實現(實際上只能有一個)通常是一個壞主意,因爲它很難嘲笑諸如單元測試之類的東西。 – EdC

+0

感謝您的快速響應。 – user1846299

+0

只是點的答案。謝謝。多一個查詢 - 將連接池對象設置爲單例的好處是什麼?從你的描述看來,如果我們將Connection對象設置爲單例,那麼用戶可以一次使用連接。所以這似乎不是很有益。如果沒有多少用戶訪問應用程序,或者用戶正在嘗試下載大文件等,可能會使用這種方法。然而,只是想知道如果我們將ConnectionPool作爲單例使用會有什麼好處? – user1846299

0

問:「然而,在數據庫連接對象中使用單例的目的是什麼?」
答:有(幾乎總是)沒有。所以你的想法是正確的。

問:「這是否意味着只有一個用戶可以訪問數據庫連接,下一個用戶必須等到連接關閉? A:取決於(到第一部分)和否(到「和」之後的第二部分)。

在單線程應用程序中,只有一個用戶將一次使用數據庫,另一個用戶將等待,直到第一個用戶的分派結束爲止,但在連接關閉時纔會結束。連接關閉後,您需要創建另一個連接以利用數據庫。

在多線程應用程序中,許多線程可能使用相同的連接實例,並且結果實際上取決於供應商實現:可能阻止調度(有效地將應用程序轉換爲單線程應用程序),或拋出異常甚至不同的東西。然而,在多線程應用程序中的這種設計在我看來是程序員錯誤。

+0

只是點的答案。謝謝。多一個查詢 - 將連接池對象設置爲單例的好處是什麼?從你的描述看來,如果我們將Connection對象設置爲單例,那麼用戶可以一次使用連接。所以這似乎不是很有益。如果沒有多少用戶訪問應用程序,或者可能是用戶正在嘗試下載大文件等,可能會使用這種方法。但是,只是想知道如果將ConnectionPool作爲單例使用會有什麼好處? – user1846299