天天看点

ORA-01000: 超出打开游标的最大数的问题

昨天在一个自己编写的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的)仔细检查一下还是很有必要的。