明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

連接池的管理

[摘要]連接池的管理:對(duì)于訪問量高的系統(tǒng),每次創(chuàng)建一個(gè)連接都會(huì)消耗一定的資源,我們可以事先創(chuàng)建好一定數(shù)量的連接放入連接池中提供給用戶使用,用戶使用完后把連接返回連接池,這里我就來說說連接池的管理。首先,讓我...
連接池的管理:
對(duì)于訪問量高的系統(tǒng),每次創(chuàng)建一個(gè)連接都會(huì)消耗一定的資源,我們可以事先創(chuàng)建好一定數(shù)量的連接放入連接池中提供給用戶使用,用戶使用完后把連接返回連接池,這里我就來說說連接池的管理。

首先,讓我們來看看連接池的概念:
1。連接池允許應(yīng)用程序從連接池中獲得一個(gè)連接并使用這個(gè)連接,而不需要為每一個(gè)連接請(qǐng)求重新建立一個(gè)連接。一旦一個(gè)新的連接被創(chuàng)建并且放置在連接池中,應(yīng)用程序就可以重復(fù)使用這個(gè)連接而不必實(shí)施整個(gè)數(shù)據(jù)庫連接創(chuàng)建過程。
2。當(dāng)應(yīng)用程序請(qǐng)求一個(gè)連接時(shí),連接池為該應(yīng)用程序分配一個(gè)連接而不是重新建立一個(gè)連接;當(dāng)應(yīng)用程序使用完連接后,該連接被歸還給連接池而不是直接釋放。

優(yōu)點(diǎn):
1。使用連接池的最主要的優(yōu)點(diǎn)是性能。
2。創(chuàng)建一個(gè)新的數(shù)據(jù)庫連接所耗費(fèi)的時(shí)間主要取決于網(wǎng)絡(luò)的速度以及應(yīng)用程序和數(shù)據(jù)庫服務(wù)器的(網(wǎng)絡(luò))距離,而且這個(gè)過程通常是一個(gè)很耗時(shí)的過程。而采用數(shù)據(jù)庫連接池后,數(shù)據(jù)庫連接請(qǐng)求可以直接通過連接池滿足而不需要為該請(qǐng)求重新連接、認(rèn)證到數(shù)據(jù)庫服務(wù)器,這樣就節(jié)省了時(shí)間。

缺點(diǎn):
1。數(shù)據(jù)庫連接池中可能存在著多個(gè)沒有被使用的連接一直連接著數(shù)據(jù)庫(這意味著資源的浪費(fèi))。
ps:這必須要求開發(fā)人員在開發(fā)時(shí)估計(jì)這個(gè)系統(tǒng)最大提供的數(shù)量是多少。

池的創(chuàng)建和分配
當(dāng)連接打開時(shí),將根據(jù)一種精確的匹配算法來創(chuàng)建連接池,該算法會(huì)使連接池與連接中的字符串相關(guān)聯(lián)。每個(gè)連接池都與一個(gè)不同的連接字符串相關(guān)聯(lián)。當(dāng)新連接打開時(shí),如果連接字符串不精確匹配現(xiàn)有池,則將創(chuàng)建一個(gè)新池。

在以下示例中,將創(chuàng)建三個(gè)新的 SqlConnection 對(duì)象,但只需要使用兩個(gè)連接池來管理這些對(duì)象。請(qǐng)注意,第一個(gè)和第二個(gè)連接字符串的差異在于為 Initial Catalog 分配的值。

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// 連接池A創(chuàng)建了

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();
// 連接池B創(chuàng)建了,因?yàn)镃onnectionString與A不匹配

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// 使用A的連接池,因?yàn)镃onnectionString與A匹配

連接池一旦創(chuàng)建,直到活動(dòng)進(jìn)程終止時(shí)才會(huì)被毀壞。非活動(dòng)或空池的維護(hù)只需要最少的系統(tǒng)開銷。

連接的添加
連接池是為每個(gè)唯一的連接字符串創(chuàng)建的。當(dāng)創(chuàng)建一個(gè)池后,將創(chuàng)建多個(gè)連接對(duì)象并將其添加到該池中,以滿足最小池大小的要求。連接將根據(jù)需要添加到池中,直至達(dá)到最大池大小。

當(dāng)請(qǐng)求 SqlConnection 對(duì)象時(shí),如果存在可用的連接,則將從池中獲取該對(duì)象。若要成為可用連接,該連接當(dāng)前必須未被使用,具有匹配的事務(wù)上下文或者不與任何事務(wù)上下文相關(guān)聯(lián),并且具有與服務(wù)器的有效鏈接。

如果已達(dá)到最大池大小且不存在可用的連接,則該請(qǐng)求將會(huì)排隊(duì)。當(dāng)連接被釋放回池中時(shí),連接池管理程序通過重新分配連接來滿足這些請(qǐng)求。對(duì) Connection 調(diào)用 Close 或 Dispose 時(shí),連接被釋放回池中。

警告 建議使用完 Connection 后始終將其關(guān)閉,以便連接可以返回到池中。這可以使用 Connection 對(duì)象的 Close 或 Dispose 方法來實(shí)現(xiàn)。不是顯式關(guān)閉的連接可能不會(huì)添加或返回到池中。例如,如果連接已超出范圍但沒有顯式關(guān)閉,則僅當(dāng)達(dá)到最大池大小而該連接仍然有效時(shí),該連接才會(huì)返回到連接池中。
注意 不要在類的 Finalize 方法中對(duì) Connection、DataReader 或任何其他托管對(duì)象調(diào)用 Close 或 Dispose。在終結(jié)器中,僅釋放類直接擁有的非托管資源。如果類不擁有任何非托管資源,則不要在類定義中包含 Finalize 方法。有關(guān)更多信息,請(qǐng)參見垃圾回收編程。

連接的移除
如果連接生存期已過期,或者連接池管理程序檢測(cè)到與服務(wù)器的連接已斷開,連接池管理程序?qū)某刂幸瞥撨B接。請(qǐng)注意,只有在嘗試與服務(wù)器進(jìn)行通信后,才可以檢測(cè)到這種情況。如果發(fā)現(xiàn)某連接不再連接到服務(wù)器,則會(huì)將其標(biāo)記為無效。連接池管理程序會(huì)定期掃描連接池,查找已釋放到池中并標(biāo)記為無效的對(duì)象。找到后,這些連接將被永久移除。

如果存在與已消失的服務(wù)器的連接,那么即使連接池管理程序未檢測(cè)到已斷開的連接并將其標(biāo)記為無效,仍有可能將此連接從池中取出。當(dāng)發(fā)生這種情況時(shí),將生成異常。但是,為了將該連接釋放回池中,仍必須將其關(guān)閉。

字符串關(guān)鍵字:
Connection Lifetime 0 當(dāng)連接返回到池中時(shí),將對(duì)它的創(chuàng)建時(shí)間和當(dāng)前時(shí)間進(jìn)行比較,如果時(shí)間間隔超過由 Connection Lifetime 指定的值(以秒為單位),則會(huì)毀壞該連接。在聚集配置中可以使用它來強(qiáng)制在運(yùn)行服務(wù)器和剛聯(lián)機(jī)的服務(wù)器之間達(dá)到負(fù)載平衡。
如果值為零 (0),則將使池連接具有最大的超時(shí)期限。

Connection Reset 'true' 確定在從池中移除數(shù)據(jù)庫連接時(shí)是否將其重置。對(duì)于 Microsoft SQL Server 版本 7.0,如果設(shè)置為 false,將避免在獲取連接時(shí)經(jīng)歷一個(gè)額外的往返過程,但必須注意的是連接狀態(tài)(如數(shù)據(jù)庫上下文)不會(huì)被重置。
Enlist 'true' 當(dāng)為 true 時(shí),如果存在事務(wù)上下文,池管理程序?qū)⒆詣?dòng)在創(chuàng)建線程的當(dāng)前事務(wù)上下文中登記連接。
Max Pool Size 100 池中允許的最大連接數(shù)。
Min Pool Size 0 池中維護(hù)的最小連接數(shù)。
Pooling 'true' 當(dāng)為 true 時(shí),將從相應(yīng)的池中取出連接,或者在必要時(shí)創(chuàng)建連接并將其添加到相應(yīng)的池中。

實(shí)例代碼:
namespace HowTo.Samples.ADONET
{

using System;
using System.Data.SqlClient;

public class connectionpooling
{
public static void Main()
{
connectionpooling myconnectionpooling = new connectionpooling();
myconnectionpooling.Run();
}

public void Run()
{
try
{
String connString;

// Specification in the connection string:
// Please note: Pooling is implicit, you automatically get it unless you disable it.
// Therefore, "true" is the default for the pooling keyword (pooling=true).
// Connection Reset: False
// Connection Lifetime: 5
// Enlist: true
// Min Pool Size: 1
// Max Pool Size: 50
connString = "server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind;" +
"connection reset=false;" +
"connection lifetime=5;" +
"min pool size=1;" +
"max pool size=50";

SqlConnection myConnection1 = new SqlConnection(connString);
SqlConnection myConnection2 = new SqlConnection(connString);
SqlConnection myConnection3 = new SqlConnection(connString);

// Open two connections.
Console.WriteLine ("打開兩個(gè)連接。");
myConnection1.Open();
myConnection2.Open();

// Now there are two connections in the pool that matches the connection string.
// Return the both connections to the pool.
Console.WriteLine ("將兩個(gè)連接都返回到池中。");
myConnection1.Close();
myConnection2.Close();

// Get a connection out of the pool.
Console.WriteLine ("從池中打開一個(gè)連接。");
myConnection1.Open();

// Get a second connection out of the pool.
Console.WriteLine ("從池中打開第二個(gè)連接。");
myConnection2.Open();

// Open a third connection.
Console.WriteLine ("打開第三個(gè)連接。");
myConnection3.Open();

// Return the all connections to the pool.
Console.WriteLine ("將所有三個(gè)連接都返回到池中。");
myConnection1.Close();
myConnection2.Close();
myConnection3.Close();
}
catch (Exception e)
{
// Display the error.
Console.WriteLine(e.ToString());
}
}
}

}





標(biāo)簽:連接池的管理