我使用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并崩溃。
我的特别错误是“解析器堆栈空间不足”和“内存分配失败”。
我想念什么吗?
原来,这是我在项目中使用的特定版本SDK(4.10-32位)的问题。除非您无限期地保持连接和命令打开状态,否则应用程序将泄漏内存。这并不是真正的解决方案,因为存在有限数量的连接,并且如果我与应用程序有多个连接,该连接很快就会用完。因为我需要继续使用此特定的SDK版本,所以我将IIS配置为在达到内存阈值(在我的实例中为1 GB)时回收应用程序池。尽管它无法解决SDK的根本问题,但目前已解决了该问题。