我正在開發一個應用程序,該應用程序應該長期運行並通過ODP.NET廣泛使用Oracle(11g)數據庫。試圖在Oracle 11g中使用ODP.NET讀取或寫入受保護的內存
但是,偶爾會發生一次(每2或3天)ODP.NET拋出System.AccessViolationException,然後應用程序需要重新啓動。這裏是我的堆棧跟蹤:
Unhandled exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at Oracle.DataAccess.Client.OpsSql.Prepare2(IntPtr opsConCtx, IntPtr& opsErrCtx, IntPtr& opsSqlCtx, IntPtr& opsDacCtx, OpoSqlValCtx*& pOpoSqlValCtx, string pCommandText, IntPtr& pUTF8CommandText, OpoMetValCtx*& pOpoMetValCtx, Int32 prmCnt)
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonquery()
堆棧跟蹤的其餘部分是不時不同,並指從我的應用程序的內部調用。
現在,我在問這裏之前做了大量的研究,但是我沒有發現任何結論。許多其他人顯然也遇到了同樣的問題,但根本原因似乎有很大差異。我真的希望有人有這個解決方案:-)
在一個不相關的說明,看起來這個異常是能夠忽略我的catch {}塊,並導致應用程序崩潰每次它發生。那是因爲它與內存損壞問題有關嗎?
問候, 安德烈
編輯:進一步的調查使我相信,這可能是值得入手的「分佈式事務協調器」服務,看看是否異常停止被拋出。你怎麼看?
僅供參考,它忽略您的try/catch塊的原因是因爲當代碼的非託管部分崩潰時,它佔用整個dot.net堆棧。 – tsells