我正在使用dbdatareader(oracledatareader(类读取来自Oracle数据库的数据。我正在Visual Studio 2010中运行该程序,使用.NET 3.5(升级到较新的.NET版本不是选项。32位应用程序(不是选择(。
代码看起来像这样:
//...some code to setup database connection, command, etc.
DbDataReader reader = null;
int count = 0;
try {
reader = command.ExecuteReader();
if(reader.HasRows) {
while(reader.Read()) {
count++;
}
}
}
finally {
if(reader != null) { reader.Close(); }
}
堆栈跟踪:
System.OutOfMemoryException was unhandled
Message=Exception of type 'System.OutOfMemoryException' was thrown.
Source=Oracle.DataAccess
StackTrace:
at Oracle.DataAccess.Client.OracleDataReader.Dispose(Boolean disposing)
at Oracle.DataAccess.Client.OracleDataReader.Close()
at Test.Program.Main(String[] args)
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
我也有多次跟踪此堆栈:
System.OutOfMemoryException was caught
Message=Exception of type 'System.OutOfMemoryException' was thrown.
Source=Oracle.DataAccess
StackTrace:
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src, Boolean bCheck)
at Oracle.DataAccess.Client.OracleDataReader.Read()
at Test.Program.Main(String[] args)
我不是在此测试案例中分配任何内存,我只是在增加一个整数,但我仍然用完了内存,这告诉我DBDataReader正在分配内存,并且可能没有正确地处理它(或者在及时的方式(。我已经尝试手动执行垃圾收集,以查看是否有帮助,但这无济于事。我还研究了它崩溃的行是否包含太多数据并因此填充剩余的内存,但这并没有加起来,因为在崩溃之前,从其他行(和丢弃(读取了大量数据。
任何想法/帮助都非常感谢,谢谢!
在绕过OracleCommand和OracleDataReader上的各种设置后,问题是,问题是最初在oracledatareader上提取太高了。
执行命令后,在oracledatareader上设置获取大小