2013-10-17 73 views
2

我們有一個Web服務器,它使用單個連接字符串連接到數據庫,這使得它成爲能夠使用連接池的強有力候選者。ConnectionPools有一個連接,還是很多?

我們需要一個SqlConnection對象還是很多?

我們應該在共享內存中建立一個連接,並且每次都使用它,或者每次我們想要使用任何連接對象時都應該創建一個新連接?

是否調用.Open()從池中分配它,還是使用相同的連接字符串創建新對象?

另外,在連接釋放回池之前,還是需要在連接上調用.Close(),或者變量超出了範圍?

我在某處讀過(我忘記了確切的地方 - 抱歉)你不應該在池中的連接上調用close,因爲它會以某種方式將它們從池中移除。

回答

1

每次需要訪問數據庫並在完成所有訪問後關閉數據庫時,應該打開一個單獨的連接。不要讓你的連接打開太久。這是沒有必要的,現代數據庫絕對非常擅長處理多個連接。

您可以將連接池的管理權限設置爲SQL Server - 只要您不嘗試阻止它,它就會做得很好。

最好使用本地連接對象,而不是跨代碼的多個部分共享它。您可以使用using模式,以確保您的連接將被關閉:

using (SqlConnection conn = new SqlConnection("connectionstring")) 
{ 
    conn.Open(); 
    // use your connection here 
} 
+0

我明白,這是最好使用「使用」,但如果我有很多的遺留代碼不,我需要擔心,或者退出範圍(並且沒有指向它的變量)會關閉連接並將其返回到池中。 – Jonathan

+0

你也可以使用'Close()',你不必使用'using'。 – Szymon

+0

不,當持有它們的變量超出範圍時連接未關閉。我現在不是100%確定,但是如果持有連接的線程被殺死或完成,連接將被關閉。當然,停止打開連接的進程也會關閉連接。 – Szymon

4

這是值得銘記的是,相同的連接字符串將重新使用已返回池中的連接,但在任何改變它方式將導致一個新的連接到服務器。

即 假設SQLBox具有IP 10.0.0.1

using (var conn = new SqlConnection(@"Server=10.0.0.1;...") { 
       conn.Open(); 
       .. Do work .. 
       conn.Close(); 
} 
using (var conn = new SqlConnection(@"Server=SQLBox;…") { 
       conn.Open(); // This will *NOT* reuse the connection from the pool. 
       .. Do work .. 
       conn.Close(); 
} 
using (var conn = new SqlConnection(@"Server=10.0.0.1;...") { 
       conn.Open(); // This *WILL* reuse the connection from the pool. 
       .. Do work .. 
       conn.Close(); 
}