यह ODP.NET के साथ एक पुराना मुद्दा है (यहां देखें:ODP के साथ स्मृति समस्याएं .NET 10.1.0.4 )।
OracleDecimal
type OpoDecCtx
. नामक आंतरिक वर्ग के एक उदाहरण का संदर्भ रखता है . OpoDecCtx IDisposable
लागू करता है (क्योंकि यह स्वयं अप्रबंधित स्मृति का संदर्भ दे रहा है), लेकिन चूंकि OracleDecimal IDisposable को लागू नहीं करता है, इसलिए आपको अंतर्निहित अप्रबंधित स्मृति को मुक्त करने के लिए कचरा संग्रहकर्ता को चलाने के लिए प्रतीक्षा करनी होगी। आप .NET रिफ्लेक्टर जैसे टूल का उपयोग करके यह सब देख सकते हैं।
यद्यपि यह तकनीकी रूप से एक "भौतिक" स्मृति रिसाव नहीं है (स्मृति अंततः मुक्त हो जाएगी), यह वास्तव में एक समस्या है जब आप 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();