我使用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左右崩溃。
我的特定错误是&#34;没有足够的空间用于解析器堆栈&#34;和&#34;内存分配失败&#34;。
我错过了什么吗?
答案 0 :(得分:4)
事实证明,这是我正在为项目使用的SDK的特定版本(4.10 - 32位)的问题。除非您将连接和命令都无限期地打开,否则应用程序将泄漏内存。这不是一个真正的解决方案,因为存在有限数量的连接,并且如果我与应用程序有多个连接,则很快就会耗尽。因为我需要继续使用这个特定的SDK版本,所以我将IIS配置为在达到内存阈值(我的实例中为1 GB)时回收应用程序池。这解决了现在的问题,尽管它没有解决SDK的基本问题。