OracleBulkCopy内存泄漏(OutOfMemory Exception)

3
以下是我用来将临时表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();
                }
            }

但是它抛出了以下异常:enter image description here 运行此数据加载过程的服务器肯定有足够的内存,看起来数据库服务器(linux)没有足够的内存。下面是数据库服务器内存截图:enter image description here 有人能帮忙解决这个问题吗?谢谢。

根据您的堆栈跟踪,OutOfMemoryException与您发布的代码完全无关。堆栈跟踪显示UCMExec.Utility类的静态构造函数引发了异常。请编辑问题并包括此静态构造函数的源代码。 - Luke Woodward
@LukeWoodward 修改了我的代码并获得了更多信息,异常是从bulkCopy.WriteToServer函数抛出的。 - mhan0125
1个回答

5
找到了根本原因,该exe在32位下运行,有1.5G的内存限制。需要更改目标平台并将Oracle.DataAccess.dll替换为64位版本。
另外还有一种解决方案:批量加载数据以避免超过1.5G的内存限制。
更新:
“使用ORACLEBULKCOPY时存在内存泄漏”:oracle bulk copy存在一些bug会导致内存泄漏,当BatchSize小于datatable大小时会发生。需要修改BatchSize或升级ODAC到更高版本。
参考:https://community.oracle.com/message/4593452#4593452

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接