我正在使用 DbDataReader (OracleDataReader) 类从 Oracle 数据库中读取数据。我在 Visual Studio 2010 中运行该程序,使用 64 位 Windows 10 Enterprise 笔记本电脑和 32GB RAM(20GB 免费),使用 .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 正在分配内存并且可能没有正确(或及时)释放它. 我试过手动进行垃圾收集,看看是否有帮助,但没有。我还研究了它崩溃的行是否包含太多数据并因此填满了剩余的内存,但这也没有加起来,因为在崩溃之前从其他行读取了更多的数据(并被丢弃) .
非常感谢任何想法/帮助,谢谢!