sql >> Database teknologi >  >> RDS >> Oracle

GetOracleDecimal Hukommelseslækage

Dette er et gammelt problem med ODP.NET (se her:Hukommelsesproblemer med ODP .NET 10.1.0.4 ).

OracleDecimal type indeholder en reference til en forekomst af en intern klasse ved navn OpoDecCtx . OpoDecCtx implementerer IDisposable (da det i sig selv refererer til ikke-administreret hukommelse), men da OracleDecimal ikke implementerer IDisposable, bliver du nødt til at vente på, at garbage collector kører for at frigøre den underliggende uadministrerede hukommelse. Du kan kontrollere alt dette ved hjælp af et værktøj såsom .NET Reflector.

Selvom det teknisk set ikke er en "fysisk" hukommelseslækage (hukommelsen vil i sidste ende blive frigivet), er det faktisk et problem, når du har at gøre med en stor mængde forekomster af typen OracleDecimal. Jeg ved ikke, hvorfor Oracle ikke bare implementerer IDisposable, det er en simpel ting at gøre...

I hvert fald foreslår jeg, at du selv laver et hack job ved at bruge refleksion:

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;
}

Og du ville bruge det sådan her:

OracleDecimal od = reader.GetOracleDecimal(5);
decimal volume = (decimal)OracleDecimal.SetPrecision(od, 28);
od.Dispose();


  1. PHP Fatal fejl Der mangler hukommelse

  2. Codeigniter Cart - lagring af data i database - hvordan griber man det an?

  3. Er der en hurtigere måde at indlæse mysqldums på?

  4. Hvordan får man JSON-data fra php og skærm til tekstvisning i Android?