Informix内存泄漏

3

我在使用 Informix 时遇到了一个奇怪的问题(具体来说,我正在使用 IBM.Data.Informix 命名空间,4.10 Client 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;
    }
}

我已经尝试了释放和关闭所有可能的连接,但好像没有帮助。 我有什么遗漏吗?还是驱动程序存在问题?那么问题就变成了,我应该怎么样逐步释放内存? 应用程序达到大约1200 MB并崩溃。

我的特定错误是“解析器堆栈空间不足”和“内存分配失败”。

我有什么遗漏吗?


当您编写了“disposing”和“closing”任何连接的代码时,您是否也在“disposing”和“closing”其他对象:IfxCommand、IfxDataReader等? - Luís Marques
@LuísMarques 是的,我关闭并处理了所有可能的东西。更深入地研究后,这可能是一个Castle Windsor问题。这是我目前的思路,我正在进行调查。 - awh112
1
获取内存分析器并查看哪些对象没有被释放以及原因,不要猜测。 - Ed Pavlov
我使用相同版本的SDK也遇到了同样的问题。这让我疯狂了。 - Tsukasa
1个回答

5
原来这是与我所用项目的特定版本的SDK(4.10 - 32位)有关的问题。除非您无限期地保持连接和命令的开放状态,否则应用程序将泄漏内存。这并不是真正的解决方案,因为连接数是有限的,如果我需要多个连接到应用程序,则很快就会用完。由于我需要继续使用此特定的SDK版本,所以我配置了IIS在达到内存阈值时(我的情况下为1 GB)回收应用程序池。这暂时解决了问题,但它对SDK的根本问题没有任何影响。

这几天我被这个问题搞得疯狂了,我不能让连接一直保持开启。你有没有找到其他的解决方案?我的Ajax查询每10秒钟就会发出一次请求。如果可以用其他方式连接,我并不一定非要使用SDK。 - Tsukasa
@Tsukasa,我找不到其他解决此问题或连接到数据库的替代方法。您不能定期回收IIS应用程序池吗?到目前为止,这个解决方案对我来说非常有效,没有服务中断。我每隔几秒钟就会轻松地击中端点。 - awh112
我已经重写了我的类,并使用ODBC创建了一个类。我将测试两者并查看RAM的情况。我没有RAM快照在我面前,但如果我记得正确,它与CNativeBuffer有关。现在我不太确定内部发生了什么,但我在Dispose中看到了大量的Marshaling和GC.KeepAlive调用。 - Tsukasa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接