Oracle
 sql >> база данни >  >> RDS >> Oracle

Изтичане на памет на GetOracleDecimal

Това е стар проблем с ODP.NET (вижте тук:Проблеми с паметта с ODP .NET 10.1.0.4 ).

OracleDecimal тип съдържа препратка към екземпляр на вътрешен клас с име OpoDecCtx . OpoDecCtx имплементира IDisposable (тъй като самият той препраща към неуправлявана памет), но тъй като OracleDecimal не прилага IDisposable, ще трябва да изчакате събирачът на боклук да стартира, за да освободи основната неуправляема памет. Можете да проверите всичко това с помощта на инструмент като .NET Reflector.

Въпреки че технически не е "физическо" изтичане на памет (паметта в крайна сметка ще бъде освободена), това всъщност е проблем, когато имате работа с голямо количество екземпляри от типа OracleDecimal. Не знам защо Oracle просто не имплементира IDisposable, това е просто нещо за правене...

Както и да е, предлагам ви сами да извършите хакерска работа, като използвате отражение:

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

И бихте го използвали така:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL - вземете броя дни между две дати за определен месец

  2. Намерете всички нечислови стойности в колона в Oracle

  3. Oracle PLSQL задаване на курсор от променлива

  4. Показване на всички екземпляри, които трябва да бъдат динамично регистрирани със слушател

  5. Oracle SQLPlus задаване на променлива на средата въз основа на променлива