SQL Server數(shù)據(jù)庫(kù)客戶端無(wú)法重新使用 SPID 為 %d 的會(huì)話,該會(huì)話已被重置用于連接池。失敗 ID 為 %d。
此錯(cuò)誤可能是由于先前的操作失敗引起的。
請(qǐng)查看錯(cuò)誤日志,找出在顯示此錯(cuò)誤消息之前剛發(fā)生的失敗操作。
2011-11-19 16:33:53.91 spid5495 The client was unable to reuse a session with SPID 5495, which had been
reset for connection pooling. The failure ID is 1. This error may have been caused by an earlier operation
failing. Check the error logs for failed operations immediately before this error message.
2011-11-19 16:33:53.93 spid2991 錯(cuò)誤: 18056,嚴(yán)重性: 20,狀態(tài): 1。
案例說(shuō)明:
當(dāng)SQLSERVER的errorlog文件中不停的報(bào)錯(cuò)10856的時(shí)候,CPU同時(shí)會(huì)很低,此時(shí)SQL客戶端登陸數(shù)據(jù)庫(kù)查詢操作正常;IIS連接數(shù)暴漲,網(wǎng)站無(wú)法操作數(shù)據(jù)庫(kù)(如登錄、基本查詢)
分析前提:
該問(wèn)題很常見(jiàn),官方解釋沒(méi)有很明確的答案,都是說(shuō)要么需要打補(bǔ)丁要么需要設(shè)置IIS的連接池。
這里分析前提是數(shù)據(jù)庫(kù)已經(jīng)打了最新的補(bǔ)丁、IIS連接數(shù)據(jù)庫(kù)的字符串正常、用戶名和密碼正常。
分析過(guò)程:
如IIS的連接池設(shè)置1500M,IIS連接數(shù)據(jù)正常1500個(gè),那么每個(gè)session分到的連接池大小平均1MB,數(shù)據(jù)庫(kù)網(wǎng)絡(luò)數(shù)據(jù)包默認(rèn)是4096;
如 果這個(gè)時(shí)候有個(gè)請(qǐng)求需要返回20M數(shù)據(jù),那么這個(gè)session從數(shù)據(jù)庫(kù)返回的數(shù)據(jù)包大小就要超過(guò)session獲得的連接池大小,數(shù)據(jù)包是4096,比 正常的請(qǐng)求(請(qǐng)求1M的回話)就需要多的數(shù)據(jù)包傳遞,這個(gè)session對(duì)應(yīng)的回話保持時(shí)間就需要比平均水平長(zhǎng)些,正常情況下,這些獨(dú)大的請(qǐng)求不會(huì)有太大 問(wèn)題。
如果同一時(shí)刻,IIS的請(qǐng)求數(shù)達(dá)到3000,每個(gè)SESSION分到的連接池大小平均值就會(huì)0.5MB,如果同樣返回20MB數(shù)據(jù),那么SESSION的時(shí)間就會(huì)更長(zhǎng)!
如果這個(gè)時(shí)候客戶端請(qǐng)求返回100個(gè)30M數(shù)據(jù),那么此時(shí)的請(qǐng)求,當(dāng)數(shù)據(jù)庫(kù)返回給IIS時(shí),IIS會(huì)發(fā)現(xiàn)連接池沒(méi)有足夠的內(nèi)存空間分配這個(gè)SESSION,此時(shí)IIS的連接池大小不會(huì)隨著客戶端請(qǐng)求的增加而自動(dòng)增加或IIS服務(wù)器沒(méi)有更多的物理內(nèi)存,此時(shí)IIS就會(huì)因?yàn)闆](méi)有足夠的連接池空間分配來(lái)緩存對(duì)應(yīng)的SESSION,但是后續(xù)的客戶端回話還是不停的向IIS申請(qǐng),這個(gè)時(shí)候問(wèn)題就來(lái)啦!
IIS會(huì)釋放掉(或IIS進(jìn)程down掉或IIS自動(dòng)重啟)沒(méi)法處理的SESSION,當(dāng)數(shù)據(jù)庫(kù)收到IIS端SESSION請(qǐng)求查詢出數(shù)據(jù)準(zhǔn)備返回給IIS的SESSION時(shí),去尋找對(duì)應(yīng)請(qǐng)求的SPID,發(fā)現(xiàn)該請(qǐng)求的SPID已經(jīng)不存在,但是數(shù)據(jù)庫(kù)的TCP連接不會(huì)因?yàn)镾PID的不存在立即拋棄這些數(shù)據(jù),此時(shí)網(wǎng)卡的流量會(huì)增加!同時(shí)數(shù)據(jù)庫(kù)ERRORLOG里全是這種錯(cuò)誤。
解決辦法:
0、首先排除DB是否有死鎖
1、最直接的辦法就是增加IIS連接池大小
2、就是找出程序中大的會(huì)話請(qǐng)求,修改代碼
3、限制IIS進(jìn)程數(shù)上限,根據(jù)日常運(yùn)行情況設(shè)置連接池大小(不推薦,迫不得已)
4、數(shù)據(jù)庫(kù)端限制sql回話時(shí)常:SQL防火墻或數(shù)據(jù)庫(kù)限制長(zhǎng)連接(不推薦,迫不得已,沒(méi)辦法的辦法)
該文章在 2019/9/29 15:30:51 編輯過(guò)