Sleeping會話導致阻塞原理(上)

2022-02-08 22:05:26 字數 1608 閱讀 2690

我在處理客戶問題的時候,客戶經常搞不懂sleeping 的由來,和他可能導致的問題。下面來詳細說下

其實我們經常可以在資料庫中看到「」sleeping「狀態的連線,但是這個sleeping 的狀態是怎麼來的,如果有很多sleeping狀態的連線對資料庫有什麼影響嗎?sleeping 代表建立了資料庫連線,但是,程式段沒有發出sql命令. 因為很多應用程式為了減少開啟和關閉連線的開銷,在完成資料庫中的操作後,仍然保持資料庫的連線。這些連線最主要的目的是重用。舉例:如果乙個應用程式使用資料庫連線提取資料,如果已經存在乙個連線可以重用,那麼建立連線的消耗當然能夠最小化。那麼,維護大量的sleeping連線會是一種開銷嗎?雖然,它相對來說是比較低的,但的確也是有開銷的。如果**編寫的合適,我們不應該看到大量的sleeping連線。

新建乙個控制台應用程式,先加入下面的**

1.建立連線並開啟

sqlconnection sqlconnection = new sqlconnection("

server=(local);database=mydb;uid=test;pwd=password;");

sqlconnection.open();

檢視資料庫會看到,此時就會出現sleeping狀態。這就是建立了連線但是沒有發出任何sql命令

2.sql執行語句完成

我們執行下面的** 。在執行的過程中可能有(running,suspened,runnale狀態)等他執行完。檢視資料庫中的狀態變為sleeping.

到目前為止,sleepig是怎麼來的應該很清楚了,,但他可能到導致的問題是什麼呢。具體看下面案例,

會話77就是sleeping操作,他阻塞了會話81,81又阻塞了75.  看看等待時間,,有點不忍直視了,數學好的同學可以數一下。   

這個問題怎麼產生的呢? 其實就是在執行 sqlcommand.executescalar(); 的時候開啟了事務,但是這個語句由於超時或者查詢被取消了,會話變成了sleeping狀態。但是事務在資料庫中中還是開啟的狀態。

通過檢視上面圖中的工具,檢視77 執行的語句,定位對應到程式中的**段,然後進行下面的改善措施:

1.在**中加入try catch的異常處理,在處理的的**中加入 :if @@trancount > 0 rollback tran

2.找到對應的執行的sql,找出他執行超時的原因加以解決。

3.使用 set xact_abort on; 他表示 如果執行 transact-sql 語句產生執行時錯誤,則整個事務將終止並回滾。

Sleeping會話導致阻塞原理(下)

背景 最近給客戶做優化時,有幾個客戶都存在.sleeping 會話中開啟了事務,導致的大量阻塞,從而產生嚴重的效能問題。雖然在之前的文章我分享了sleeping會話導致阻塞原理 上 說明了什麼是sleeping會話,以及他可能導致的問題。但是對如何解決問題,給出的方案,還是太簡單了,沒有給出解決的細...

Sleeping會話導致阻塞原理(下)

最近給客戶做優化時,有幾個客戶都存在.sleeping 會話中開啟了事務,導致的大量阻塞,從而產生嚴重的效能問題。雖然在之前的文章我分享了sleeping會話導致阻塞原理 上 說明了什麼是sleeping會話,以及他可能導致的問題。但是對如何解決問題,給出的方案,還是太簡單了,沒有給出解決的細節。本...

什麼導致執行緒阻塞?

導致執行緒阻塞的原因主要有以下幾方面。1 執行緒進行了休眠 執行緒執行了thread.sleep int n 方法,執行緒放棄cpu,睡眠n毫秒,然後恢復執行。2 執行緒要執行一段同步 由於無法獲得相關的同步鎖,只好進入阻塞狀態,等到獲得了同步鎖,才能恢復執行。3 執行緒執行wait 進入阻塞狀態 ...