我面临与SQL Server的连接未正确关闭的问题。我可以使用sp_who2或sp_who观察打开的连接(正在睡眠)。我对服务器进行了一些WEB呼叫,可以看到连接数量正在增加。在一定数量的连接下,我确实遇到了超时。我呼叫的网站只有以下代码(混淆),它打开了与SQL Server的连接:
private string getsomedetails(string Name, string applicationConnectionString)
{
string empty = string.Empty;
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = new SqlConnection(applicationConnectionString);
sqlCommand.CommandText = "SELECT xx FROM dbo.xxx WHERE Name = @xyz";
sqlCommand.Parameters.AddWithValue("@xyz", (object) Name);
sqlCommand.Connection.Open();
return sqlCommand.ExecuteScalar().ToString();
}
我了解到,连接处于上述阻塞状态时将被关闭。但是例外情况会怎样?
我的连接字符串如下:
<connectionStrings>
<add name="AssetConnectionString"
providerName="System.Data.SqlClient"
connectionString= "server=SERVERNAME;
database=DBNAME;
uid=USERNAME;
pwd=PASSWORD;
application name=APPNAME"
/>
我现在的解决方法是在IIS中回收应用程序池。此后,API将照常响应。
一些详细信息:Microsoft SQL Server 2014(SP3-CU4)(KB4500181)IIS版本6.2
我的猜测是代码有漏洞,任何帮助都被投票!
您需要一个“ using”块来实现自动连接关闭。像这样的东西:
using (SqlConnection connection = new SqlConnection(myConnString))
{
connection.Open();
SqlCommand cmd = new SqlCommand(fullSQLString, connection);
foreach (SqlParameter p in sqlParameters)
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
}
连接不会因为您离开函数作用域而关闭。关键是失去功能的作用域不会自动处理对象。但是,当阻止范围完成时,“使用”命令确实会自动处置该对象。从Microsoft documentation:
using语句定义一个范围,对象将在该范围的末尾被处置。
当代码块执行并完成时,SQLConnection对象“连接”的处置过程将导致与数据库的关闭连接。
尝试此格式:
private string getsomedetails(string Name, string applicationConnectionString)
{
string empty = string.Empty;
string SQLStr = "SELECT xx FROM dbo.xxx WHERE Name = @xyz";
using(SqlConnection connection = new SqlConnection(applicationConnectionString))
{
connection.Open();
SqlCommand sqlCommand = new SqlCommand(SQLStr, connection);
sqlCommand.Parameters.AddWithValue("@xyz", (object) Name);
return sqlCommand.ExecuteScalar().ToString();
}
}