国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Timeout expired 超時(shí)時(shí)間已到. 達(dá)到了最大池大小 錯(cuò)誤及Max Pool Size設(shè)置

2019-11-17 01:47:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Timeout expired 超時(shí)時(shí)間已到. 達(dá)到了最大池大小 錯(cuò)誤及Max Pool Size設(shè)置

參考數(shù)據(jù)庫(kù)鏈接串:

<addkey="data"value="server=192.168.1.123;Port=3306;uid=root;pwd=root;database=data;pooling=true;minpoolsize=5;maxpoolsize=512;connecttimeout=20;"/>

查看應(yīng)用程序池占用數(shù)量:

select*fromsys

Max Pool Size:如果未設(shè)置則默認(rèn)為100,理論最大值為32767。最大連接數(shù)是連接池能申請(qǐng)的最大連接數(shù),如果數(shù)據(jù)庫(kù)連接請(qǐng)求超過(guò)此數(shù),后面的數(shù)據(jù)庫(kù)連接請(qǐng)求將被加入到等待隊(duì)列中,這會(huì)影響之后的數(shù)據(jù)庫(kù)操作。在等待隊(duì)列中,默認(rèn)等待與服務(wù)器的連接的時(shí)間為15秒。

中文錯(cuò)誤:

超時(shí)時(shí)間已到。超時(shí)時(shí)間已到,但是尚未從池中獲取連接。出現(xiàn)這種情況可能是因?yàn)樗谐剡B接均在使用,并且達(dá)到了最大池大小。

英文錯(cuò)誤:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

問(wèn)題描述:我們獲取連接超過(guò)連接池最大值時(shí)產(chǎn)生如上異常。通常連接池最大值為100。當(dāng)我們獲取連接超過(guò)最大值時(shí),ADO.NET等待連接池返回連接而超時(shí),這樣將拋出如上異常 解決辦法:首先要做的是在我們使用連接后立即關(guān)閉連接。如果沒(méi)有關(guān)閉連接那么連接將保存到連接池中知道GC來(lái)銷(xiāo)毀。這種情況下你以為連接池沒(méi)有到達(dá)最大值但實(shí)際上連接池已經(jīng)到達(dá)了最大值 其次我們可以通過(guò)連接字符串中的Max Pool Size = N;來(lái)動(dòng)態(tài)擴(kuò)大連接池中的連接最大數(shù)量。

說(shuō)明:

也就是在connectionString中如果未指定max pool size的值,則max pool size=100,當(dāng)訪問(wèn)人員同時(shí)連接數(shù)據(jù)庫(kù)的數(shù)量為101人時(shí),則等待SqlConnection.ConnectionTimeout設(shè)置的時(shí)間(默認(rèn)是15 秒)后,還是沒(méi)有可用的Connection則會(huì)出現(xiàn)上面的錯(cuò)誤。

當(dāng)我們?cè)O(shè)置為:

"Server=(local); Integrated Security=SSPI; Database=Northwind; Max Pool Size=512; Min Pool Size=5" 時(shí)。則訪問(wèn)人員同時(shí)連接數(shù)據(jù)庫(kù)的數(shù)量為513時(shí),則等待SqlConnection.ConnectionTimeout設(shè)置的時(shí)間(默認(rèn)是15 秒)后,還是沒(méi)有可用的Connection則 就會(huì)出現(xiàn)上面的錯(cuò)誤。

-Connection Pool是什么呢 ?每當(dāng)程序需要讀寫(xiě)數(shù)據(jù)庫(kù)的時(shí)候。Connection.Open()會(huì)使用ConnectionString連接到數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)會(huì)為程序建立 一個(gè)連接,并且保持打開(kāi)狀態(tài),此后程序就可以使用T-SQL語(yǔ)句來(lái)查詢/更新數(shù)據(jù)庫(kù)。當(dāng)執(zhí)行到Connection.Close()后,數(shù)據(jù)庫(kù)就會(huì)關(guān)閉當(dāng) 前的連接。很好,一切看上去都是如此有條不紊。但是如果我的程序需要不定時(shí)的打開(kāi)和關(guān)閉連接,(比如說(shuō)
asp.net 或是 Web Service ),例如當(dāng)Http Request發(fā)送到服務(wù)器的時(shí)候、,我們需要打開(kāi)Connection 然后使用Select* from Table 返回一個(gè)DataTable/DataSet給客戶端/瀏覽器,然后關(guān)閉當(dāng)前的Connection。那每次都Open/Close Connection 如此的頻繁操作對(duì)于整個(gè)系統(tǒng)無(wú)疑就成了一種浪費(fèi)。ADO.Net Team就給出了一個(gè)比較好地解決方法。將先前的Connection保存起來(lái),當(dāng)下一次需要打開(kāi)連接的時(shí)候就將先前的Connection 交給下一個(gè)連接。這就是Connection Pool。-Connection Pool如何工作的?首先當(dāng)一個(gè)程序執(zhí)行Connection.open()時(shí)候,ADO.net就需要判斷,此連接是否支持Connection Pool (Pooling 默認(rèn)為T(mén)rue),如果指定為False, ADO.net就與數(shù)據(jù)庫(kù)之間創(chuàng)建一個(gè)連接(為了避免混淆,所有數(shù)據(jù)庫(kù)中的連接,都使用”連接”描述),然后返回給程序。

如果指定為 True,ADO.net就會(huì)根據(jù)ConnectString創(chuàng)建一個(gè)Connection Pool,然后向Connection Pool中填充Connection(所有.net程序中的連接,都使用”Connection”描述)。填充多少個(gè)Connection由Min Pool Size (默認(rèn)為0)屬性來(lái)決定。例如如果指定為5,則ADO.net會(huì)一次與SQL數(shù)據(jù)庫(kù)之間打開(kāi)5個(gè)連接,然后將4個(gè)Connection,保存在 Connection Pool中,1個(gè)Connection返回給程序。

當(dāng)程序執(zhí)行到Connection.close() 的時(shí)候。如果Pooling 為T(mén)rue,ADO.net 就把當(dāng)前的Connection放到Connection Pool并且保持與數(shù)據(jù)庫(kù)之間的連接。

同時(shí)還會(huì)判斷Connection Lifetime(默認(rèn)為0)屬性,0代表無(wú)限大,如果Connection存在的時(shí)間超過(guò)了Connection LifeTime,ADO.net就會(huì)關(guān)閉的Connection同時(shí)斷開(kāi)與數(shù)據(jù)庫(kù)的連接,而不是重新保存到Connection Pool中。

(這個(gè)設(shè)置主要用于群集的SQL 數(shù)據(jù)庫(kù)中,達(dá)到負(fù)載平衡的目的)。如果Pooling指定為False,則直接斷開(kāi)與數(shù)據(jù)庫(kù)之間的連接。

然后當(dāng)下一次Connection.Open() 執(zhí)行的時(shí)候,ADO.Net就會(huì)判斷新的ConnectionString與之前保存在Connection Pool中的Connection的connectionString是否一致。

(ADO.Net會(huì)將ConnectionString轉(zhuǎn)成二進(jìn)制流,所 以也就是說(shuō),新的ConnectionString與保存在Connection Pool中的Connection的ConnectionString必須完全一致,即使多加了一個(gè)空格,或是修改了Connection String中某些屬性的次序都會(huì)讓ADO.Net認(rèn)為這是一個(gè)新的連接,而從新創(chuàng)建一個(gè)新的連接。所以如果您使用的UserID,PassWord的認(rèn) 證方式,修改了Password也會(huì)導(dǎo)致一個(gè)Connection,如果使用的是SQL的集成認(rèn)證,就需要保存兩個(gè)連接使用的是同一個(gè))。

然后 ADO.net需要判斷當(dāng)前的Connection Pool中是否有可以使用的Connection(沒(méi)有被其他程序所占用),如果沒(méi)有的話,ADO.net就需要判斷ConnectionString設(shè) 置的Max Pool Size (默認(rèn)為100),如果Connection Pool中的所有Connection沒(méi)有達(dá)到Max Pool Size,ADO.net則會(huì)再次連接數(shù)據(jù)庫(kù),創(chuàng)建一個(gè)連接,然后將Connection返回給程序。

如果已經(jīng)達(dá)到了 MaxPoolSize,ADO.net就不會(huì)再次創(chuàng)建任何新的連接,而是等待Connection Pool中被其他程序所占用的Connection釋放,這個(gè)等待時(shí)間受SqlConnection.ConnectionTimeout(默認(rèn)是15 秒)限制,也就是說(shuō)如果時(shí)間超過(guò)了15秒,SqlConnection就會(huì)拋出超時(shí)錯(cuò)誤(所以有時(shí)候如果SqlConnection.open()方法拋 出超時(shí)錯(cuò)誤,一個(gè)可能的原因就是沒(méi)有及時(shí)將之前的Connnection關(guān)閉,同時(shí)Connection Pool數(shù)量達(dá)到了MaxPoolSize。)

如果有可用的Connection,從Connection Pool 取出的Connection也不是直接就返回給程序,ADO.net還需要檢查ConnectionString的ConnectionReset屬性 (默認(rèn)為T(mén)rue)是否需要對(duì)Connection 最一次reset。這是由于,之前從程序中返回的Connection可能已經(jīng)被修改過(guò),比如說(shuō)使用 SqlConnection.ChangeDatabase method 修改當(dāng)前的連接,此時(shí)返回的Connection可能就已經(jīng)不是連接當(dāng)前的Connection String指定的Initial Catalog數(shù)據(jù)庫(kù)了。所以需要reset一次當(dāng)前的連接。但是由于所有的額外檢查都會(huì)增大ADO.net Connection Pool 對(duì)系統(tǒng)的開(kāi)銷(xiāo)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 珠海市| 天等县| 辰溪县| 陇南市| 特克斯县| 本溪市| 阿合奇县| 革吉县| 赤水市| 太仓市| 营口市| 工布江达县| 桐柏县| 保靖县| 分宜县| 德兴市| 沙洋县| 莱西市| 屯门区| 乌鲁木齐县| 寿阳县| 恭城| 河池市| 焦作市| 大同县| 禄丰县| 怀仁县| 卓资县| 阳山县| 木里| 汉中市| 怀柔区| 绍兴县| 宜丰县| 和林格尔县| 桓仁| 宿州市| 额济纳旗| 内黄县| 鹿泉市| 固安县|