問題描述:
一個業務復雜、執行時間很長的功能,經常報出“基礎鏈接已經關閉:接收時發生錯誤”,很是蹊蹺。。。
問題分析:
首先,查閱應用服務器的系統日志,發現問題發生時總是會伴隨着w3wp進程崩潰的錯誤,很有問題呀。。。
錯誤存儲段 ,類型 0 事件名稱: APPCRASH 響應: 不可用 Cab Id: 0 問題簽名: P1: w3wp.exe P2: 7.5.7601.17514 P3: 4ce7afa2 P4: oracommon11.dll P5: 11.2.0.3 P6: 4eb215cc P7: c00000fd P8: 00000000001714b3 P9: P10: 附加文件: 可在此處獲取這些文件: C:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_w3wp.exe_7d10d2c9218567c5ec5b216598b20a1b57c250_54fec352 分析符號: 重新檢查解決方案: 0 報告 Id: 48b4afbc-6dcf-11e6-b732-f4e9d489a2e0 報告狀態: 4 哈希存儲段: %22
找到一個自動收集了dump的日志,打開查看錯誤信息,噢噢。。。。
0:351> !pe -nested Exception object: 000000073fdb1158 Exception type: System.StackOverflowException Message: <none> InnerException: <none> StackTrace (generated): <none> StackTraceString: <none> HResult: 800703e9 Nested exception ------------------------------------------------------------- Exception object: 00000008c0a98f50 Exception type: System.Data.OracleClient.OracleException Message: ORA-00001
: 違反唯一約束條件 (LCXXXXX.PK_XXXXXXX) InnerException: <none> StackTrace (generated): SP IP Function 000000004E4AB990 000007FEF43B0458 System_Data_ni!System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(System.Data.Common.RowUpdatedEventArgs, BatchCommandInfo[], Int32)+0x19a0e8 000000004E4ABA10 000007FEF4216295 System_Data_ni!System.Data.Common.DbDataAdapter.UpdatedRowStatus(System.Data.Common.RowUpdatedEventArgs, BatchCommandInfo[], Int32)+0x35 000000004E4ABA40 000007FEF421550A System_Data_ni!System.Data.Common.DbDataAdapter.Update(System.Data.DataRow[], System.Data.Common.DataTableMapping)+0x92a 000000004E4ABB20 000007FEF4215ED9 System_Data_ni!System.Data.Common.DbDataAdapter.UpdateFromDataTable(System.Data.DataTable, System.Data.Common.DataTableMapping)+0x39 000000004E4ABB60 000007FEF4214AB5 System_Data_ni!System.Data.Common.DbDataAdapter.Update(System.Data.DataSet, System.String)+0xc5 000000004E4ABBE0 000007FE9AD15365 UNKNOWN!xxxxx.Platform.Core.DataAccess.Oracle.OracleDatabase.DataBatchImportPart(System.Data.DataTable, System.String)+0x225 000000004E4ABC80 000007FE9AD15093 UNKNOWN!xxxxx.Platform.Core.DataAccess.Database.DataBatchImport(System.Data.DataTable, System.String)+0xe3 000000004E4ABCE0 000007FE9D2D339A UNKNOWN!xxxxx.Platform.AppFramework.CCMCore.XXXBatchLockDAC.AddBatchLock(System.Collections.Generic.List`1<xxxxx.Platform.AppFramework.CcmSPI.XXXLockData>, System.String ByRef, Boolean, System.String ByRef)+0x29a 000000004E4ABDB0 000007FE9D2D304A UNKNOWN!xxxxx.Drp.Biz.Com.DataLockMgr.AddBatchLock(System.Collections.Generic.List`1<xxxxx.Platform.AppFramework.CcmSPI.XXXLockData>, System.String ByRef, System.String ByRef)+0x9a 000000004E4ABE00 000007FE9D2D2D75 UNKNOWN!xxxxx.Drp.Biz.Com.DataLockMgr.AddBatchLock(System.Collections.Generic.List`1<xxxxx.Platform.AppFramework.CcmSPI.XXXLockData>, System.String, System.String ByRef)+0x45
反編譯現場的對應的DLL發現貌似存在遞歸調用???
對應的刪除SQL
delete from SYLOCK_APBill where SYLOCK_OWNERID = '0ae7c1e5-fc23-4ea7-ad34-9ca03fd2ea02' and SYLOCK_FUNCID = ''
原來,最初反饋問題的功能執行時間太長,在此期間因為別的功能報出棧溢出錯誤,進而造成進程崩潰,所以才會出現最初看到的疑似網絡問題的錯誤!
問題結論:
至此問題定位:未完全覆蓋所有條件場景,造成應用系統遞歸死循環!直至棧溢出!
解決問題的方法很簡單:數據庫庫對應字段設置為非空,或應用系統代碼中增加兼容性處理,增強系統自身的健壯性。