我们有 ASP.NET 应用程序,可以通过 odp.net 连接到 Oracle 数据库。
最近我们开始遇到一些性能问题。看来 Oracle 连接不会关闭,最终会堆积起来,直到导致我们的网站崩溃。
作为第一步,我们进行了代码审查,并确保在执行后关闭所有打开的连接。
OracleConnection cn = Helpers.ConnectToDB();
try
{
cn.Open();
//do somtehing
}
catch (Exception ex)
{
//log error
}
finally
{
cn.Close();
cn.Dispose();
}
但这并没有帮助,每隔几个小时连接就会堆积起来并导致我们的网站崩溃。
这是昨天的连接日志:
TO_CHAR(DATE_TIME,'DD/MM/YYYY MACHINE STATUS CONNECTIONS
19/01/2012 14:40:03 WORKGROUP\OTH-IIS-1 ACTIVE 1
19/01/2012 14:38:00 WORKGROUP\OTH-IIS-1 ACTIVE 2
19/01/2012 14:35:57 WORKGROUP\OTH-IIS-1 ACTIVE 2
19/01/2012 14:34:55 WORKGROUP\OTH-IIS-1 ACTIVE 28
19/01/2012 14:33:54 WORKGROUP\OTH-IIS-1 ACTIVE 26
19/01/2012 14:31:51 WORKGROUP\OTH-IIS-1 ACTIVE 34
19/01/2012 14:30:49 WORKGROUP\OTH-IIS-1 ACTIVE 96
19/01/2012 14:29:47 WORKGROUP\OTH-IIS-1 ACTIVE 73
19/01/2012 14:28:46 WORKGROUP\OTH-IIS-1 ACTIVE 119
19/01/2012 14:27:44 WORKGROUP\OTH-IIS-1 ACTIVE 161
19/01/2012 14:26:43 WORKGROUP\OTH-IIS-1 ACTIVE 152
19/01/2012 14:25:41 WORKGROUP\OTH-IIS-1 ACTIVE 109
19/01/2012 14:24:40 WORKGROUP\OTH-IIS-1 ACTIVE 74
19/01/2012 14:23:38 WORKGROUP\OTH-IIS-1 ACTIVE 26
19/01/2012 14:22:36 WORKGROUP\OTH-IIS-1 ACTIVE 2
19/01/2012 14:21:35 WORKGROUP\OTH-IIS-1 ACTIVE 2
崩溃点发生在 14:27:44,重新启动应用程序后,连接开始断开。
我们使用的连接字符串是:
<add name="OracleRead" connectionString="Data Source=xxx;User Id=yyy;Password=zzz;Max Pool Size=250;Connection Timeout=160;" providerName="Oracle.DataAccess"/>
那么这里的问题是什么?
我们是否需要定义或更改以下属性之一:
Connection Lifetime, Decr Pool Size, Max Pool Size, Min Pool Size?
在这种情况下建议的设置是什么?
最佳答案
您需要显式处置所有 Oracle.DataAccess 对象,包括连接、命令和参数。
请参阅此处评论中的代码示例:
https://nhibernate.jira.com/browse/NH-278
其他一些注意事项:
- 优先使用 using 关键字,因为即使在特殊情况下也能保证处理
- ODP Paramter 对象很特殊(与常规 ADO.NET 参数协定相比),因为它也需要显式处置(而 SQL Server 版本则不需要)
关于Oracle 连接未关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8937753/