Toto je starý problém s ODP.NET (viz zde:Problémy s pamětí u ODP .NET 10.1.0.4 ).
OracleDecimal
type obsahuje odkaz na instanci interní třídy s názvem OpoDecCtx
. OpoDecCtx implementuje IDisposable
(protože sama odkazuje na nespravovanou paměť), ale protože OracleDecimal neimplementuje IDisposable, budete muset počkat, až se spustí garbage collector, aby uvolnil základní nespravovanou paměť. To vše můžete zkontrolovat pomocí nástroje, jako je .NET Reflector.
I když se technicky nejedná o „fyzický“ únik paměti (paměť bude nakonec uvolněna), ve skutečnosti jde o problém, když máte co do činění s velkým množstvím instancí typu OracleDecimal. Nevím, proč Oracle jednoduše neimplementuje IDisposable, je to jednoduchá věc...
Každopádně doporučuji, abyste si udělali nějakou hackovací práci sami pomocí reflexe:
public static class OracleExtentions
{
public static void Dispose(this OracleDecimal od) // build an extension method
{
if (OracleDecimalOpoDecCtx == null)
{
// cache the data
// get the underlying internal field info
OracleDecimalOpoDecCtx = typeof(OracleDecimal).GetField("m_opoDecCtx", BindingFlags.Instance | BindingFlags.NonPublic);
}
IDisposable disposable = OracleDecimalOpoDecCtx.GetValue(od) as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
private static FieldInfo OracleDecimalOpoDecCtx;
}
A použili byste to takto:
OracleDecimal od = reader.GetOracleDecimal(5);
decimal volume = (decimal)OracleDecimal.SetPrecision(od, 28);
od.Dispose();