2009-02-19 86 views
2

我使用ODP.Net版本11.1.0插入數據到數據庫中,我看到內存泄漏。如果我註釋掉下面的代碼,它就會消失。這段代碼在我的應用程序中被稱爲數千次,並且我可以看到所有堆中的字節數隨着它的運行而穩步增長。 cmdStr包含一個插入到375列的表中的插入語句。除了兩個字段外,這些字段都是NUMBER - 一個是DATE,另一個是VARCHAR2(20)。有什麼我需要做的清理OracleCommand?這裏沒有引發異常 - 插入命令每次都成功。內存泄漏與OracleCommand

編輯:我試着移動return語句,並沒有按預期的效果 - 使用實際上是一個try-finally塊。

更新:我使用CLRProfiler來查看內存的使用情況,它是一堆字符串對象,約2800個字符串對象。它們的引用由Oracle數據訪問.Client.ConnDataPool對象擁有的HashTable對象持有。 ODP.NET爲什麼要保持這些?

try 
{ 
    using (OracleCommand cmd = new OracleCommand(cmdStr, conn)) 
    { 
     cmd.CommandTimeout = txTimeout; 
     int nRowsAffected = cmd.ExecuteNonQuery(); 
     errMsg = null; 
     return EndpointResult.Success; 
    } 
} 
catch (OracleException e) 
{ 
    return BFOracleAdapter.HandleOracleException(e, out errMsg); 
} 
catch (Exception e) 
{ 
    errMsg = "OracleInsertOperation Exception: " + e.Message; 
    return EndpointResult.Error; 
} 
+0

在此代碼中一切看起來不錯。問題:1.您是否正確地部署了OracleConnection對象? 2. CLRProfiler中可以看到什麼字符串? 作爲一種破解,我認爲有一種方法可以關閉/重置連接池中的所有連接... – ConsultUtah 2009-02-20 21:30:56

回答

0

試着將return語句移到using塊之外。

+0

使用將會清理乾淨,但是你會擺脫它。可能問題在於'conn'沒有被處置。 – Loofer 2009-12-18 16:23:50

1

嘗試改制類似:

object o; 
    using (OracleCommand cmd = new OracleCommand(cmdStr, conn)) 
    { 
    try 
    { 
     cmd.CommandTimeout = txTimeout; 
     int nRowsAffected = cmd.ExecuteNonQuery(); 
     errMsg = null; 
     o = EndpointResult.Success; 
    } 
    catch (OracleException e) 
    { 
     o = BFOracleAdapter.HandleOracleException(e, out errMsg); 
    } 
    catch (Exception e) 
    { 
     errMsg = "OracleInsertOperation Exception: " + e.Message; 
     o = EndpointResult.Error; 
    } 
    finally 
    { 
     // clean up 
    } 
    } 
    return o 
1

你保持你的連接打開?嘗試在每次需要發出此命令時都嘗試打開一個新連接(無論如何它都會集中在一起,因此不會影響性能),請在完成事務後關閉&並查看內存泄漏是否消失。

4

嘗試包裹using語句與周圍的OracleConnection使用的聲明是這樣的:

這會得到儘快擺脫的OracleConnection對象的 - 即使在OracleException將occure using語句內。

0

連接池中的最大連接數是多少?默認情況下,使用100個最大連接啓用連接池。

您不顯示創建/部署連接的代碼部分。我懷疑這個問題更可能發生在哪裏。

0

嘗試使用:Oracle.ManagedDataAccess.Client而不是Oracle.DataAccess.Client。