超时过期异常;可以';我找不到哪个连接是打开的,或者是否有其他问题
本文关键字:或者 是否 问题 其他 或者是 连接 可以 异常 过期 找不到 超时 | 更新日期: 2023-09-27 18:20:29
我得到"超时已过期。从池中获取连接之前已过超时期。这可能是因为所有池连接都在使用中,并且达到了最大池大小。"错误,但找不到问题所在。请帮忙。:)
public static void Update(string p, int c)
{
using (SqlConnection conn = new SqlConnection("ConnectionString"))
{
SqlCommand cmd = new SqlCommand();
SqlDataReader myRdr;
cmd.Connection = conn;
cmd.CommandText = "SOME SQL QUERY @parameter";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@parameter", SqlDbType.NVarChar, 10).Value = p;
conn.Open();
myRdr = cmd.ExecuteReader();
if (myRdr.HasRows)
{
while (myRdr.Read())
{
//do something using myRdr data
}
myRdr.Close();
cmd.Dispose();
foreach (DataRow r in dt.Rows)
{
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = conn;
cmd1.CommandText = "SOME SQL QUERY @parameter";
cmd1.CommandType = CommandType.Text;
cmd1.Parameters.Add("@parameter", SqlDbType.NVarChar, 10).Value = r["SomeData"];
myRdr = cmd1.ExecuteReader();
myRdr.Read();
//do something with myRdr data
myRdr.Close();
cmd1.Dispose();
int a = Convert.ToInt32(r["SomeData"]) - Convert.ToInt32(r["SomeData1"]);
if (a >= 0)
{
//do something
}
else
{
//do something else and runn the Update() again with some other parameters
Update(x, y); //I think here is some problem...
//because when this condition is not met and program
//does not need to run Update() again, it goes OK and I get no error
}
}
}
else
{
myRdr.Close();
cmd.Dispose();
}
}
}
您应该协调将呼叫移动到外部using()
块之外的某个Update(x,y)
。
从内部using
调用它意味着要建立到同一数据库的另一个连接,而不首先释放外部数据库。如果你得到了大量的递归调用,那么你会很快用完可用的连接。
通常,在处理数据库的代码部分使用递归调用被认为是一种非常糟糕的做法。
如果你真的需要这个递归,那么它仍然应该在外部using
之外完成。我建议将x,y
缓存在某种集合中,并通过在using
块外遍历该集合来发出对Update(x,y)
的调用,如下所示:
public static void Update(string p, int c)
{
// I'd suggest Dictionary, but don't know whether your strings are unique
var recursionParameters = new List<KeyValuePair<string, int>>();
using (SqlConnection conn = new SqlConnection("ConnectionString"))
{
...
//do something else and runn the Update() again with some other parameters
//Update(x, y); Don't do it here! Instead:
recursionParameters.Add(new KeyValuePair<string, int>(x,y));
...
}
foreach (var kvp in recursionParameters
{
Update(kvp.Key, kvp.Value)
}
}
发生异常时,您的Reader
可能不会关闭。用tryfinally块将其包围,这样当您遇到异常时,您的读者将对finally语句关闭。
try
{
myRdr = cmd.ExecuteReader();
// do some other stuff
}
catch(SqlException)
{
// log the exception or deal with ex.
}
finally
{
myRdr.Close(); // you can be sure it will be closed even on exception
}