在C 中實現連線池

2021-04-19 07:04:44 字數 2309 閱讀 6000

使用連線池

連線到資料庫伺服器通常由幾個需要軟長時間的步驟組成。必須建立物理通道(例如套接字或命名管道),必須與伺服器進行初次連線,必須分析連線字串資訊,必須由伺服器對連線進行身份驗證,等等。

實際上,大部份的應用程式都是使用乙個或幾個不同的連線配置。當應用程式的資料量和訪問量大的時候,這意味著在執行應用程式的過程中,許多相同的連線將反覆地被開啟和關閉,從而會引起資料庫伺服器效率低下甚至引發程式崩潰。為了確保應用程式的穩定和降低效能成本,我們可以在ado.net中使用稱為連線池的優化方法來管理維護連線。

連線池可以減少建立連線的次數。定義最小連線數(固定連線數),當使用者在連線上呼叫 open,連線池就會檢查池中是否有可用的連線。如果發現有連線可用,會將該連線返回給呼叫者,而不是建立新連線。應用程式在該連線上呼叫 close 時,連線池會判斷該連線是否在最小連線數之內,如果「是」會將連線**到活動連線池中而不是真正關閉連線,否則將燒毀連線。連線返回到池中之後,即可在下乙個 open 呼叫中重複使用。

建立連線池以下示例使用c# 連線sql資料庫:

class dbconn

private

string getconnstring()

public datatable getdatareader(string strsql)//資料查詢

tryreturn

null;

}catch (exception ex)

finally}}

通過呼叫sqldrconn.open()方法開啟連線,這時候連線池就會初始化並建立設定的最小連線數。想更清楚了解到連線池的狀況可以通過sql的查詢分析器執行儲存過程sp_who,它會列出當前的資料庫程序,檢視loginname、dbname可以區分使用者的連線資訊,但要注意的是登入查詢分析器本身會使用兩個連線,所以最好用另乙個使用者名稱登入查詢分析器。使用此方法還有乙個麻煩地方就是要經常按「執行查詢」以更新程序資訊。還有另一種方法個人認為較好的,通過

控制面板管理工具效能,右擊新增計算器,效能物件選擇sqlserver:general statistics(常規統計)然後計算器選擇user connections(使用者連線)最後按「新增」就可以實時檢視當前連線數。

到了這裡,連線池已經實現了, 但問題往往會出現在執行過程中。如連線池的連線數滿了該怎樣處理?在這裡我們應該合理設定連線字串中的connect timeout屬性和connection lifetime屬性(上面有解釋)延長等待時間,盡可能地在每次使用完連線之後呼叫close方法關閉連線。但從中也有沒法避免的,當連線數滿了並且申請連線的時間超過設定連線等待的時間時,程式將會引發invalidoperationexceptio異常,我們可以通過捕獲此異常向使用者介面提示「系統正忙,請稍後再連線……」之類的資訊來緩解這種情況。此外,也有另一種方法來解決這種情況,就是利用ado.net 2.0新特性「非同步程序」,對資料庫進行非同步操作,確保連線能夠及時呼叫close方法關閉連線,這樣能大大減少正在使用的連線數。

使用方法:在連線字串中加上asynchronous processing=true表示使用非同步處理操作。

當應用程式不再需要用到連線池的時候可以使用clearpoolclearallpools方法清空連線池也可作重置連線池使用,方法如下:

sqlconnection.clearpool(sqlconnection connection)清空關聯的連線池

sqlconnection.clearallpools()

清空所有連線池

呼叫上述方法,如果連線正在使用,連線池會做相應標記,等連線關閉時自動燒毀。

小結c#連線池優點:當資料庫操作和訪問頻繁的時候,減少建立連線和開啟連線所耗的時間,提公升資料庫伺服器的效能。

缺點:資料庫連線池中可能存在著多個沒有被使用的連線一直連線著資料庫,這意味著資源的浪費。

JDBC連線池實現

jdbc connection pool 的注意事項有 1.有乙個簡單的函式從連線池中得到乙個 connection。2.close 函式必須將 connection 放回 資料庫連線池。3.當資料庫連線池中沒有空閒的 connection,資料庫連線池必須能夠自動增加 connection 個數。...

Java實現連線池

連線池原理,非常透徹 public class connectionpool catch exception e try catch exception e static catch filenotfoundexception e catch ioexception e 建立乙個資料庫連線池,連線池...

ftp連線池實現

專案中需要用到ftp,經常性的開關會造成極大的開銷,效率比較低。就想封裝乙個ftp連線池,不過遺憾的是沒有找到現成的,只得根據別人提供的思路來實現了。建立若干個ftp連線,然後將這些連線放入阻塞佇列blockingqueue中,每次使用時從佇列中獲取乙個連線,使用完成後將連線重新插入佇列中。實現 o...