c#应用程序中的ODBC泄漏内存

Posted

技术标签:

【中文标题】c#应用程序中的ODBC泄漏内存【英文标题】:ODBC leaking memory in c# application 【发布时间】:2013-09-30 09:20:17 【问题描述】:

我似乎有内存泄漏。我在 *** 上找到了推荐“使用”方法的帖子,但这似乎无法解决问题。

我正在使用 Red Gate 内存分析器,它显示非托管内存不断增加。

这是我用来测试的简单应用程序:

namespace TimerDebug

public partial class TimerDebug : ServiceBase

    public TimerDebug()
    
        InitializeComponent();
    

    protected override void OnStart(string[] args)
    
         // Create Timer
        Timer MyTimer = new Timer(500);
        MyTimer.Elapsed += MyTimer_Elapsed;

        // Start Timer
        MyTimer.Start();

    

    void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
    
        using (var C = new OdbcConnection("Dsn=MyFireReport;"))
        

            C.Open();

        

        OdbcConnection.ReleaseObjectPool();
    

    protected override void OnStop()
    
    


有人知道如何解决这个问题吗? 谢谢。

【问题讨论】:

我正在使用 Paradox 数据库驱动程序。 您是否尝试将OdbcConnection.ReleaseObjectPool(); 放在using 块内? 这个想法是odbcconnection对象只存在于using语句期间,因此将releaseobjectpool放置在确保对象已被释放并因此关闭,准备释放。 我正在尝试您现在的建议,也许会有所作为。我会告诉你的。 你是对的。我猜想在 using 中包含 ReleaseObjectPool 需要在它之前显式关闭,这会很奇怪。一点头绪都没有也许这会有所帮助,因为悖论驱动程序和 FM 的一样写得很好***.com/q/13513224/1236044 【参考方案1】:

OdbcConnection.ReleaseObjectPool(); 是造成这种情况的原因。我遇到了一些严重的问题,不断增加的句柄和内存泄漏导致 DEP 关闭了我的软件。 使用 SQLClient 中的类比可以观察到相同的问题,甚至在使用此语句之前关闭或释放连接也无济于事。

我已将OdbcConnection.ReleaseObjectPool(); 留作仅用于在我的情况下作为与 Oracle 服务器的连接被破坏的危急情况。

目前我已经删除了这些,软件已经稳定运行了一个多星期了。

【讨论】:

以上是关于c#应用程序中的ODBC泄漏内存的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 的图像加载内存泄漏

PerfView专题 (第二篇):如何寻找 C# 中的 Heap堆内存泄漏

C++/C# 应用程序中的内存泄漏

C# 中的内存泄漏

Informix 内存泄漏

PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏