sql >> Databáze >  >> RDS >> Oracle

GetOracle Decimal Únik paměti

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();


  1. Chyba při pokusu o spuštění Create Extension postgis

  2. Nelze načíst SqlServerSpatial.dll

  3. Po určité době nasazení na serveru se nelze připojit k databázi

  4. Převod IP na Long v MySQL