我想使用odp.net的OracleBulkCopy类将数据从Microsoft Sql Server数据库复制到Oracle数据库。我有一个大约有2M行和100列的表。我遇到了内存分配的问题。下面的代码似乎是在分配内存,并且永远不会释放,直到它得到一个无法分配内存异常。
我使用了一个非常类似的代码,使用System.Data.SqlClient.SqlBulkCopy函数将数据从Oracle传输到MSSQL服务器,从来没有遇到过这种问题。
using (SqlConnection sourceConnection =
new SqlConnection(sourceConn))
{
sourceConnection.Open();
SqlCommand commandSourceData = new SqlCommand(
sourceSQL, sourceConnection);
commandSourceData.CommandTimeout = 1000000;
using (OracleConnection destinationConnection =
new OracleConnection(connStr))
{
destinationConnection.Open();
using (OracleBulkCopy bulkCopy =
new OracleBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName = destinationTable;
bulkCopy.BatchSize = 10000;
bulkCopy.BulkCopyTimeout = 10000;
bulkCopy.WriteToServer(commandSourceData.ExecuteReader(CommandBehavior.SequentialAccess));
}
}
}当我检查内存分配时,这两个函数似乎占用了大部分内存:
-System.Data.SqlClient.SqlDataReader.GetValue(int32) (70%) -Oracle.DataAccess.Types.DecimalConv.GetBytes(valuetype System.Decimal,原生整型) (20%)
有谁知道问题的原因吗?
谢谢。
发布于 2014-03-19 05:15:33
确保显式地关闭()和Dispose()您的ODP.NET对象。垃圾回收器不知道非托管代码占用的内存。
https://stackoverflow.com/questions/22374283
复制相似问题