我在處理客戶問題的時候,客戶經常搞不懂sleeping 的由來,和他可能導致的問題。下面來詳細說下
其實我們經常可以在資料庫中看到「」sleeping「狀態的連線,但是這個sleeping 的狀態是怎麼來的,如果有很多sleeping狀態的連線對資料庫有什麼影響嗎?sleeping 代表建立了資料庫連線,但是,程式段沒有發出sql命令. 因為很多應用程式為了減少開啟和關閉連線的開銷,在完成資料庫中的操作後,仍然保持資料庫的連線。這些連線最主要的目的是重用。舉例:如果乙個應用程式使用資料庫連線提取資料,如果已經存在乙個連線可以重用,那麼建立連線的消耗當然能夠最小化。那麼,維護大量的sleeping連線會是一種開銷嗎?雖然,它相對來說是比較低的,但的確也是有開銷的。如果**編寫的合適,我們不應該看到大量的sleeping連線。
新建乙個控制台應用程式,先加入下面的**
1.建立連線並開啟
sqlconnection sqlconnection = new sqlconnection("檢視資料庫會看到,此時就會出現sleeping狀態。這就是建立了連線但是沒有發出任何sql命令server=(local);database=mydb;uid=test;pwd=password;");
sqlconnection.open();
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 進入阻塞狀態 ...