原由:許多用戶可能在查詢相同的數據庫以獲取相同的數據。在這些情況下,可以通過使應用程序共享到數據源的連接來提高應用程序的性能。否則,讓每個用戶打開和關閉單獨的連接的開銷會對應用程序性能產生不利影響。這樣就有了連接池。
實現:
C#在連接字符串中設置連接池。
如果使用的是 OleDbConnection、OdbcConnection 或 OracleConnection 類,則連接池將由提供程序自動處理,所以您不必自己進行管理。
如果使用的是 SqlConnection 類,則連接池被隱式管理,但也提供選項允許您自己管理池。
連接使用Open()方法打開連接,這時候連接池就會初始化並建立設定的最小連接數。在使用完連接時一定要關閉連接,以便連接可以返回池。要關閉連接使用Close()
當連接數滿了並且申請連接的時間超過設置連接等待的時間時,使用“異步進程”,對數據庫進行異步操作,確保連接能夠及時調用Close方法關閉連接,這樣能大大減少正在使用的連接數。
例子:
以下示例使用C# 連接SQL數據庫:
class DbConn
{
//using System.Data;
//using System.Data.SqlClient;
private const int MaxPool = 10; //最大連接數
private const int MinPool = 5; //最小連接數
private const bool Asyn_Process = true; //設置異步訪問數據庫
private const bool Mars = true; //在單個連接上得到和管理多個、僅向前引用和只讀的結果集(ADO.NET2.0)
private const int Conn_Timeout = 15; //設置連接等待時間
private const int Conn_Lifetime = 15; //設置連接的生命週期
private string ConnString = ""; //連接字符串
private SqlConnection SqlDrConn = null; //連接對象
public DbConn()//構造函數
{
ConnString = GetConnString();
SqlDrConn = new SqlConnection(ConnString);
}
private string GetConnString()
{
return "server=localhost;"
+ "integrated security=sspi;"
+ "database=pubs;"
+ "Max Pool Size=" + MaxPool + ";"
+ "Min Pool Size=" + MinPool + ";"
+ "Connect Timeout=" + Conn_Timeout + ";"
+ "Connection Lifetime=" + Conn_Lifetime + ";"
+"Asynchronous Processing=" + Asyn_Process + ";";
//+ "MultipleActiveResultSets=" + Mars + ";";
}
public DataTable GetDataReader(string StrSql)//數據查詢
{
//當連接處於打開狀態時關閉,然後再打開,避免有時候數據不能及時更新
if (SqlDrConn.State == ConnectionState.Open)
{
SqlDrConn.Close();
}
try
{
SqlDrConn.Open();
SqlCommand SqlCmd = new SqlCommand(StrSql, SqlDrConn);
SqlDataReader SqlDr = SqlCmd.ExecuteReader();
if (SqlDr.HasRows)
{
DataTable dt = new DataTable();
//讀取SqlDataReader裏的內容
dt.Load(SqlDr);
//關閉對象和連接
SqlDr.Close();
SqlDrConn.Close();
return dt;
}
return null;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return null;
}
finally
{
SqlDrConn.Close();
}
}
}