Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OracleBulkCopy内存泄漏(OutOfMemory异常)_C#_Oracle_Memory Leaks_Bulkinsert_Sqlbulkcopy - Fatal编程技术网

C# OracleBulkCopy内存泄漏(OutOfMemory异常)

C# OracleBulkCopy内存泄漏(OutOfMemory异常),c#,oracle,memory-leaks,bulkinsert,sqlbulkcopy,C#,Oracle,Memory Leaks,Bulkinsert,Sqlbulkcopy,下面是我用来将数据从临时表dataTable复制到Oracle数据库中destTable的代码。dataTable有大约200万条记录 using (OracleBulkCopy bulkCopy = new OracleBulkCopy(VMSDATAConnectionString)) { try { foreach (OracleBulkCopyColumnMap

下面是我用来将数据从临时表dataTable复制到Oracle数据库中destTable的代码。dataTable有大约200万条记录

using (OracleBulkCopy bulkCopy = new OracleBulkCopy(VMSDATAConnectionString))
            {
                try
                {
                    foreach (OracleBulkCopyColumnMapping columnMapping in columnMappings)
                        bulkCopy.ColumnMappings.Add(columnMapping);

                    bulkCopy.DestinationTableName = destTableName;
                    //bulkCopy.BatchSize = dataTable.Rows.Count;
                    //bulkCopy.BulkCopyTimeout = 100;                   
                    int defaultSize = 5000;
                    int.TryParse(ConfigurationManager.AppSettings["OracleBulkCopyBatchSize"], out defaultSize);
                    bulkCopy.BatchSize = defaultSize;
                    int timeOut = 100;
                    int.TryParse(ConfigurationManager.AppSettings["OracleBulkCopyTimeout"], out timeOut);
                    bulkCopy.BulkCopyTimeout = timeOut;
                    Console.WriteLine("Bulk insert from {0} to {1} started at: {2}\r\nBatchSize : {3}, BulkCopyTimeout : {4} ", dataTable.TableName, destTableName, DateTime.Now.ToString("HH:mm:ss"), bulkCopy.BatchSize.ToString(), bulkCopy.BulkCopyTimeout.ToString());
                    bulkCopy.WriteToServer(dataTable);
                    Console.WriteLine("Bulk insert from {0} to {1} finished at: {2}", dataTable.TableName, destTableName, DateTime.Now.ToString("HH:mm:ss"));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error happened during bulk copy from {0} to {1}\r\nBatchSize : {2}, BulkCopyTimeout : {3}\r\n Error message {4}", dataTable.TableName, destTableName, bulkCopy.BatchSize.ToString(), bulkCopy.BulkCopyTimeout.ToString(), ex.ToString());
                    bulkCopy.Close();
                    bulkCopy.Dispose();
                }
            }
但它引发了以下异常:

运行此数据加载过程的服务器肯定有足够的内存,看起来数据库服务器(linux)没有足够的内存。下面是数据库服务器内存屏幕截图:


有人能帮忙解决这个问题吗?谢谢。

找到了根本原因,exe以32位运行,内存限制为1.5G。需要更改目标平台并将Oracle.DataAccess.dll替换为64位版本

还有另一种解决方案:批量加载数据,使其不会超过1.5g内存限制

更新:

“使用ORACLEBULKCOPY的内存泄漏”:oracle BulkCopy存在一些导致内存泄漏的错误,当BatchSize小于datatable size时会发生这种情况。 需要修改BatchSize或将ODAC更新到更高版本


参考资料:

根据stacktrace判断,OutOfMemoryException与您发布的代码完全无关。stacktrace指出,
UCMExec.Utility
类的静态构造函数是引发异常的对象。请编辑此问题并包含此静态构造函数的源。@LukeWoodward修改了我的代码并获得了更多信息,异常是从bulkCopy.WriteToServer函数引发的。