您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何在c#項(xiàng)目中設(shè)置使用連接池,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
C#在連接字符串中設(shè)置連接池
如果使用的是 OleDbConnection、OdbcConnection 或 OracleConnection 類,則連接池將由提供程序自動處理,所以您不必自己進(jìn)行管理。
如果使用的是 SqlConnection 類,則連接池被隱式管理,但也提供選項(xiàng)允許您自己管理池。
連接使用Open()方法打開連接,這時候連接池就會初始化并建立設(shè)定的最小連接數(shù)。在使用完連接時一定要關(guān)閉連接,以便連接可以返回池。要關(guān)閉連接使用Close()
當(dāng)連接數(shù)滿了并且申請連接的時間超過設(shè)置連接等待的時間時,使用“異步進(jìn)程”,對數(shù)據(jù)庫進(jìn)行異步操作,確保連接能夠及時調(diào)用Close方法關(guān)閉連接,這樣能大大減少正在使用的連接數(shù)。
當(dāng)數(shù)據(jù)庫操作和訪問頻繁的時候,減少創(chuàng)建連接和打開連接所耗的時間,提升數(shù)據(jù)庫服務(wù)器的性能。 這里將詳細(xì)分析C#數(shù)據(jù)庫連接池。
連接到數(shù)據(jù)庫服務(wù)器通常由幾個需要軟長時間的步驟組成。必須建立物理通道(例如套接字或命名管道),必須與服務(wù)器進(jìn)行初次連接,必須分析連接字符串信息,必須由服務(wù)器對連接進(jìn)行身份驗(yàn)證,等等。
實(shí)際上,大部份的應(yīng)用程序都是使用一個或幾個不同的連接配置。當(dāng)應(yīng)用程序的數(shù)據(jù)量和訪問量大的時候,這意味著在運(yùn)行應(yīng)用程序的過程中,許多相同的連接將反 復(fù)地被打開和關(guān)閉,從而會引起數(shù)據(jù)庫服務(wù)器效率低下甚至引發(fā)程序崩潰。為了確保應(yīng)用程序的穩(wěn)定和降低性能成本,我們可以在ADO.NET中使用稱為連接池的優(yōu)化方法來管理維護(hù)連接。
C#數(shù)據(jù)庫連接池可以減少創(chuàng)建連接的次數(shù)。定義最小連接數(shù)(固定連接數(shù)),當(dāng)用戶在連接上調(diào)用Open,連接池就會檢查池中是否有可用的連接。如果發(fā)現(xiàn)有連接可用,會將該連接返回給調(diào)用者,而不是創(chuàng)建新連接。應(yīng)用程序在該連接上調(diào)用Close時,連接池會判斷該連接是否在最小連接數(shù)之內(nèi),如果“是”會將連接回收到活動連接池中而不是真正關(guān)閉連接,否則將燒毀連接。連接返回到池中之后,即可在下一個Open調(diào)用中重復(fù)使用。
以下示例使用C#連接SQL數(shù)據(jù)庫:
class DbConn { //using System.Data; //using System.Data.SqlClient; private const int MaxPool = 10; //最大連接數(shù) private const int MinPool = 5; //最小連接數(shù) private const bool Asyn_Process = true; //設(shè)置異步訪問數(shù)據(jù)庫 private const bool Mars = true; //在單個連接上得到和管理多個、僅向前引用和只讀的結(jié)果集(ADO.NET2.0) private const int Conn_Timeout = 15; //設(shè)置連接等待時間 private const int Conn_Lifetime = 15; //設(shè)置連接的生命周期 private string ConnString = ""; //連接字符串 private SqlConnection SqlDrConn = null; //連接對象 public DbConn()//構(gòu)造函數(shù) { 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)//數(shù)據(jù)查詢 { //當(dāng)連接處于打開狀態(tài)時關(guān)閉,然后再打開,避免有時候數(shù)據(jù)不能及時更新 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里的內(nèi)容 dt.Load(SqlDr); //關(guān)閉對象和連接 SqlDr.Close(); SqlDrConn.Close(); return dt; } return null; } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); return null; } finally { SqlDrConn.Close(); } } }
通過調(diào)用SqlDrConn.Open()方法打開連接,這時候連接池就會初始化并建立設(shè)定的最小連接數(shù)。想更清楚了解到連接池的 狀況可以通過SQL的查詢分析器執(zhí)行存儲過程sp_Who,它會列出當(dāng)前的數(shù)據(jù)庫進(jìn)程,查看loginname、dbname可以區(qū)分用戶的連接信息,但 要注意的是登錄查詢分析器本身會使用兩個連接,所以最好用另一個用戶名登錄查詢分析器。使用此方法還有一個麻煩地方就是要經(jīng)常按“執(zhí)行查詢”以更新進(jìn)程信 息。還有另一種方法個人認(rèn)為較好的,通過控制面板→管理工具→性能,右擊添加計(jì)算器,性能對象選擇 SQlServer:GeneralStatistics(常規(guī)統(tǒng)計(jì))然后計(jì)算器選擇UserConnections(用戶連接)最后按“添加”就可以實(shí) 時查看當(dāng)前連接數(shù)。
到了這里,連接池已經(jīng)實(shí)現(xiàn)了,但問題往往會出現(xiàn)在運(yùn)行過程中。如連接池的連接數(shù)滿 了該怎樣處理?在這里我們應(yīng)該合理設(shè)置連接字符串中的ConnectTimeout屬性和ConnectionLifetime屬性(上面有解釋)延長等 待時間,盡可能地在每次使用完連接之后調(diào)用Close方法關(guān)閉連接。但從中也有沒法避免的,當(dāng)連接數(shù)滿了并且申請連接的時間超過設(shè)置連接等待的時間時,程 序?qū)l(fā)InvalidOperationExceptio異常,我們可以通過捕獲此異常向用戶界面提示“系統(tǒng)正忙,請稍后再連接……”之類的信息來緩 解這種情況。此外,也有另一種方法來解決這種情況,就是利用ADO.NET2.0新特性“異步進(jìn)程”,對數(shù)據(jù)庫進(jìn)行異步操作,確保連接能夠及時調(diào)用 Close方法關(guān)閉連接,這樣能大大減少正在使用的連接數(shù)。
使用方法:在連接字符串中加上AsynchronousProcessing=true表示使用異步處理操作。
當(dāng)應(yīng)用程序不再需要用到連接池的時候可以使用ClearPool或ClearAllPools方法清空連接池也可作重置連接池使用,方法如下:
SqlConnection.ClearPool(SqlConnectionconnection)清空關(guān)聯(lián)的連接池
SqlConnection.ClearAllPools()清空所有連接池
調(diào)用上述方法,如果連接正在使用,連接池會做相應(yīng)標(biāo)記,等連接關(guān)閉時自動燒毀。
優(yōu)點(diǎn):當(dāng)數(shù)據(jù)庫操作和訪問頻繁的時候,減少創(chuàng)建連接和打開連接所耗的時間,提升數(shù)據(jù)庫服務(wù)器的性能。
缺點(diǎn):數(shù)據(jù)庫連接池中可能存在著多個沒有被使用的連接一直連接著數(shù)據(jù)庫,這意味著資源的浪費(fèi)。
上述內(nèi)容就是如何在c#項(xiàng)目中設(shè)置使用連接池,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。