我有一个使用mysql作为数据库的ASP.NET网站。我注意到当我显示完整的进程列表时,有很多连接“正在休眠”。今天我们遇到了一些错误“在从池中获取连接之前已经过了超时时间”。如果进程“正在休眠”,那么它们是否仍然从代码中打开?代码中的所有MySQL连接都在using语句中。我可以依靠using语句来正确关闭连接吗?
编辑代码: 我正在使用这个类创建我的连接:
public class DbAccess
{
public static MySqlConnection OpenConnection(string connectionStringName)
{
string connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
if (string.IsNullOrEmpty(connectionString))
{
throw new ArgumentException("Connection string " + connectionStringName + " does not exist.");
}
MySqlConnection connection = new MySqlConnection(connectionString);
connection.Open();
return connection;
}
}
然后我这样称呼它:
using (MySqlConnection connection = DbAccess.OpenConnection(connectionString))
{
//Code Here
}
一些额外的信息:重置MySql并没有消除错误,但重置我的应用程序池确实..
答案 0 :(得分:1)
希望这可以提供任何帮助:MySqlConnection really not close 和 Using MySQLConnection in C# does not close properly 还有这个 http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/c57c0432-c27b-45ab-81ca-b2df76c911ef
答案 1 :(得分:1)
使用块的C#保证调用对象的.Dispose()方法,即使抛出异常也是如此。这意味着它是安全的,只有当您的提供者使用.Dispose()方法来关闭连接时。查看documentation for that type,我看到这段摘录(见第25.2.3.3.5节):
从Open到Closed,使用Close方法或连接对象的Dispose方法。
这告诉我你可以通过Dispose方法关闭连接,因此你应该只需using
块。
答案 2 :(得分:0)
是的,绝对。
using (MySqlConnection connection = DbAccess.OpenConnection(connectionString))
{
//Code Here
}
与
完全相同MySqlConnection connection = null
try
{
connection = DbAccess.OpenConnection(connectionString)
//Code Here
}
finally
{
if (connection is IDisposable)
connection.Dispose
}
如果MySqlConnection类实现了IDisposable,那么它将被正确清理。如果你需要调用另一个方法,比如close而不是或者更好,那么考虑上面更详细的语法并在finally中添加方法。