2014-03-13 55 views
3

我想使用odp.net的OracleBulkCopy類將數據從Microsoft Sql Server數據庫複製到Oracle數據庫。我有一個大約2M行和100列的桌子。我有內存分配問題。下面的代碼似乎是分配內存,永遠不會釋放,直到它得到一個不能分配內存異常。使用odp.net批量複製c#

我使用了一個非常相似的代碼,使用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(value類型System.Decimal,本地int)(20%)

有沒有人有任何關於問題的原因的想法?

謝謝。

+0

當您通過託管堆提取整個數據庫時,預計會有大量的分配。找出什麼是*持有*內存活着。根源是什麼?讓我們希望這不是Oracle代碼,因爲那樣你運氣不好。 – usr

+0

你爲什麼使用.NET sql客戶端?你有沒有考慮過純粹使用Oracle適配器? – Ramie

回答

0

確保顯式關閉()和處置()您的ODP.NET對象。垃圾收集器不知道非託管代碼持有的內存。