我在我的网站上发现了这个错误:如何修复此代码中的SQL连接泄漏?
超时已过期。在从池中获取 连接之前已经超时。可能发生了这种情况,因为所有连接池都正在使用中,并且已达到最大池大小。
描述:在执行 当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及源代码的位置。
异常详细信息:System.InvalidOperationException:超时已过期。 从 池获取连接之前已超时。这可能是因为所有池连接都在 使用中,并且达到最大池大小。
这是一个到处都在重复使用C#类(我认为泄漏是在这里):
public class Generator
{
SqlConnection cn = null; // new SqlConnection(connectionString);
public SqlConnection Connection {
get {
if (cn == null) {
cn = new SqlConnection("Server=xxxxx,1433;Database=xxxxx;User ID=xxxxx;Password=xxxxx;Trusted_Connection=False;Encrypt=True;");
}
if(cn.State != ConnectionState.Open)
cn.Open();
return cn;
}
}
}
在我的方法
然后我用这样的:
var cmd = _generator.Connection.CreateCommand();
cmd.CommandText = "SELECT * FROM SomeTable";
var reader = cmd.ExecuteReader();
while (reader.Read())
{
//DO SOMETHING
}
reader.Close();
编辑:在我的方法类中,我试图通过多种方法共享相同的SQL连接,如下所示:
private Generator _generator;
public HomeController()
{
InitializeConnection();
}
private void InitializeConnection()
{
_generator = new Generator();
}
任何人都可以看到我如何解决泄漏或什么导致我的最大池问题?
不是ac#开发人员,但不应该是'this.cn'或类似的,以表明cn是一个类变量,而不仅仅是连接方法中的局部变量? – 2012-02-22 16:01:28
您并未在任何地方关闭连接。 – Oded 2012-02-22 16:01:55
@MarcB - 如果引用不含糊,则不需要用'this'限定变量。 – Oded 2012-02-22 16:02:42