C# Informix内存泄漏

C# Informix内存泄漏,c#,sql,.net,memory-leaks,informix,C#,Sql,.net,Memory Leaks,Informix,我在使用Informix时遇到了一个奇怪的问题(具体来说,我使用的是IBM.Data.Informix名称空间,4.10客户端SDK)。我使用ODBC连接到IBM Informix数据库,遇到内存泄漏问题。文档非常稀少,我一直在使用当前安装的驱动程序/SDK。以下是我用于数据库上下文的代码: public class IfxDbContext : IIfxDbContext { private readonly string _connectionString; //privat

我在使用Informix时遇到了一个奇怪的问题(具体来说,我使用的是IBM.Data.Informix名称空间,4.10客户端SDK)。我使用ODBC连接到IBM Informix数据库,遇到内存泄漏问题。文档非常稀少,我一直在使用当前安装的驱动程序/SDK。以下是我用于数据库上下文的代码:

public class IfxDbContext : IIfxDbContext
{
    private readonly string _connectionString;
    //private readonly IfxConnection _connection;

    public IfxDbContext(string connectionString)
    {
        _connectionString = connectionString;
        //IfxConnection conn = new IfxConnection(connectionString) {ConnectionString = connectionString};

        //_connection = conn;
    }

    public IEnumerable<Item> GetItems()
    {
        var items = new List<Item>();

        try
        {
            using (IfxConnection conn = new IfxConnection(_connectionString))
            {
                conn.Open();

                using (IfxCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "VALID SQL COMMAND";

                    IfxDataReader dr = cmd.ExecuteReader();

                    while (dr.Read())
                    {
                        //add to items
                    }
                }
            }
        }
        catch(IfxException ex)
        {

        }

        return items;
    }
}
公共类IfxDbContext:IIfxDbContext
{
私有只读字符串_connectionString;
//专用只读IfxConnection\u连接;
公共IfxDbContext(字符串连接字符串)
{
_connectionString=connectionString;
//IfxConnection conn=新IfxConnection(connectionString){connectionString=connectionString};
//_连接=连接;
}
公共IEnumerable GetItems()
{
var items=新列表();
尝试
{
使用(IfxConnection conn=新的IfxConnection(_connectionString))
{
conn.Open();
使用(IfxCommand cmd=conn.CreateCommand())
{
cmd.CommandText=“有效的SQL命令”;
IfxDataReader dr=cmd.ExecuteReader();
while(dr.Read())
{
//添加到项目
}
}
}
}
捕获(IfxException-ex)
{
}
退货项目;
}
}
}

我尝试过处理和关闭任何连接,但似乎没有帮助。我是遗漏了什么还是司机出了问题?接下来的问题是,我能做些什么来逐步释放内存?该应用程序的容量约为1200 MB,并崩溃

我的具体错误是“没有足够的空间用于解析器堆栈”和“内存分配失败”


我遗漏了什么吗?

结果表明,这是我在项目中使用的SDK的特定版本(4.10-32位)的问题。除非将连接和命令无限期地保持打开状态,否则应用程序将泄漏内存。这并不是一个真正的解决方案,因为连接的数量是有限的,如果我有多个应用程序连接,那么连接的数量很快就会用完。因为我需要继续使用这个特定的SDK版本,所以我将IIS配置为在应用程序池达到内存阈值(在我的实例中为1GB)时回收应用程序池。这暂时解决了问题,尽管它没有解决SDK的根本问题。

当你写到你正在处理和关闭任何连接时,你是否也在处理/关闭所有其他对象:IfxCommand、IfxDataReader等?@LuísMarques是的,我关闭并处理了我能处理的一切。进一步研究,这可能是温莎城堡的问题。这是我目前的想法,我目前正在调查。获取内存分析器,查看哪些对象未被释放,以及为什么,不要猜测我在同一版本的SDK中遇到了相同的问题。这让我抓狂。我无法告诉你这几天我有多抓狂。由于我无法保持连接打开,您是否找到了其他解决方案。我的Ajax查询每10秒命中一次。但是,如果我可以通过另一种方式连接,@Tsukasa I无法找到解决此问题的任何其他解决方案,也无法找到连接到数据库的任何其他方式,那么我就不会使用SDK。您是否不能每隔一段时间回收IIS应用程序池?到目前为止,该解决方案对我很有效,没有中断服务。我每隔几秒钟就点击一次端点,没有问题。我重写了我的类,并使用ODBC创建了一个类。我将测试这两个,看看ram会发生什么。我面前没有ram快照,但如果我没记错的话,它与CNativeBuffer有关。现在,我不确定side中发生了什么,但我在Dispose中看到了很多封送以及GC.KeepAlive调用。