下面是我用来将数据从临时表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)没有足够的内存。下面是数据库服务器内存屏幕截图:
有人能帮忙解决这个问题吗?谢谢。
发布于 2015-05-07 13:06:43
找到根本原因后,exe在32位内运行,内存限制为1.5G。需要更改目标平台并将Oracle.DataAccess.dll替换为64位版本。
还有另一种解决方案:批量加载数据,这样就不会超过1.5G内存限制。
更新:
“使用ORACLEBULKCOPY的内存泄漏”:oracle大容量复制存在一些导致内存泄漏的错误,当BatchSize小于datatable大小时就会发生这种情况。需要修改BatchSize或将ODAC更新为更高版本。
https://stackoverflow.com/questions/30109156
复制