【发布时间】:2014-11-04 14:28:36
【问题描述】:
所以我已经阅读了很多关于 SqlDataReaders 没有在 .Net 中正确处理的信息 - 我一直在与“超时已过期。在从池中获取连接之前已经过的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小”错误几天了。显然,我可以将最大池大小提升到 30,000 - 但这并不能解决实际问题。
在单步执行代码时,我执行以下 SQL 查询:
select * from sys.dm_os_performance_counters
where counter_name ='User Connections'
之后
cmd.Connection.Open();
行,用户连接数增加 1。但是,除非我在 Web 服务器上回收应用程序池(此时来自网站的所有活动数据库连接都被终止),否则它永远不会恢复。
这是我的代码:
public static DataTable SPExecuteDataTable(string[] ConnectionData, params object[] args)
{
SqlConnection conn = null;
SqlCommand cmd = null;
SqlDataReader dr = null;
try
{
conn = new SqlConnection(ConnectionData[1]);
cmd = new SqlCommand(ConnectionData[0], new SqlConnection(ConnectionData[1]));
cmd.CommandType = CommandType.StoredProcedure;
for (int i = 0; i < args.Length; i++)
{
SqlParameter Param = new SqlParameter(ConnectionData[i + 2], DBNullIfNull(args[i]));
cmd.Parameters.Add(Param);
}
cmd.Connection.Open();
DataTable dt = new DataTable();
using (dr = cmd.ExecuteReader())
{
if (dr != null)
dt.Load(dr);
else
dt = null;
}
return dt;
}
catch (Exception e)
{
Exception x = new Exception(String.Format("DataAccess.SPExecuteDataTable() {0}", e.Message));
throw x;
}
finally
{
conn.Close();
cmd.Connection.Close();
dr.Close();
conn.Dispose();
cmd.Dispose();
dr.Dispose();
}
到目前为止,我已经尝试显式关闭连接(就像在我的 finally 块中一样),但这不起作用。我也尝试过使用这样的语句:
using (SqlDataReader dr = blah blah blah)
{
//code here
}
但这也行不通。我的代码有什么问题,在这里?
【问题讨论】:
标签: c# sql asp.net database-connection