我遇到的问题是无法正确关闭与我们的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
我的猜测是代码有漏洞,任何帮助都被剥夺了!
答案 0 :(得分:3)
您需要一个“ 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();
}
}