昨天在一個自己編寫的windows服務運作中出現了這個問題,功能大體上是通過調用web服務從一個資料庫擷取資料更新到另一個資料庫中(這2個資料庫業務實作的要求有相似之處,但表結構設計差異較大,彼此又存在資料互動的需要,是以就采用了這種設計方案),每天23點進行一次操作,白天測試用了幾條資料跑沒發現任何問題,部署以後晚上在真實環境下運作出現了如下錯誤:ORA-01000: 超出打開遊标的最大數
OraOLEDB
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForMultpleResults(tagDBPARAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(Command
Behavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) at PMVMWindowService.OleDbHelper.ExecuteDataset(OleDbConnection connection, CommandType commandType, String commandText, OleDbParameter[] commandParameters)
at PMVMWindowService.Service1.GetTEngineInfo(OleDbConnection oleCn, String strFid, String strVer) at PMVMWindowService.Service1.OperateTer(OleDbConnection oleCn, String strXML, String strVer)
at PMVMWindowService.Service1.RSyncTer()
仔細檢查了代碼發現我隻在RSyncTer方法中聲明并打開一個資料庫連接配接,而在RSyncTer方法中調用的OperateTer方法以及OperateTer方法調用的GetTEngineInfo方法統統使用了這個連接配接,再看一下操作資料庫的底層方法裡并沒有關閉連接配接,我隻是在RSyncTer方法的finally塊裡關閉了連接配接,這樣看似是僅使用了一個連接配接,目的是想減少對連接配接資源的占用,但在運作時由于涉及的多個方法都要用到資料庫連接配接(通過傳連接配接參數)實際上是循環一次執行一條資料打開了多個連接配接,要命的是這些連接配接每次都沒關閉,對資料庫查詢來說就是打開了多個遊标,資料量大的時候(當時運作環境也就1500條的樣子)這個問題才會出現了。看來大家在使用第三方資料通路類時(本人這個項目所用到的類也是直接從網上down的)仔細檢查一下還是很有必要的。