2021年1月9日 星期六

關於 SQL timeout 的錯誤判別

        今天看到網路上一篇討論 SQL Timeout 原因的探討文章。

        由於那篇文章的結論和我過去經驗完全不同,所以我懷疑是不是我過去仰賴的長期判斷經驗有誤,特別寫了個 TestCase 作為比較。

        首先我先引用該文章作為調查起點的 Exception 內容:

        


        我先講一下那篇文章的結論,作者認為應該是 Connection Pooling 機制,造成無法有效取得 Pool 中的 Connection 所造成。但我有印象,無法取得 Connection 並不是 SqlException 這種錯誤,而是 InvalidOperationException 這個錯誤。

        而且根據他給的錯誤訊息,明白寫上 Execution Timeout,所以我認定應該是執行的命令超過指定時間造成。為了驗證我過去的認知,我寫了一段 Test case 去測試。

        第一個案例很簡單,就是執行一個需要十秒才能完成的指令,但是我在 Timeout 上卻只給 1 秒,所以會立刻就爆 Timeout 錯誤。


        第二個案例,就是故意耗盡 Connection Pool 的資源,利用 List 鎖住這些取而不用的 Connection 物件,避免被 GC 回收掉。


        讓我們比對兩這產生的 Error log 吧。

        擷取輸出的 log 如下:





        所以我的經驗是真的,想法沒錯。原文章的病灶應該是指令本身太過耗時,應該以效能優化來作解法。

沒有留言:

張貼留言