ASP.NET使用C#代码杀死所有打开的SQL Server连接
有没有办法杀死ASP.NET代码中所有打开的SQL Server连接?我为什么要这样做?因为有些团队开发人员忘记关闭他们的连接,我讨厌提醒他们ASP.NET使用C#代码杀死所有打开的SQL Server连接,c#,asp.net,sql-server,connection-pooling,C#,Asp.net,Sql Server,Connection Pooling,有没有办法杀死ASP.NET代码中所有打开的SQL Server连接?我为什么要这样做?因为有些团队开发人员忘记关闭他们的连接,我讨厌提醒他们 SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); SqlDataAdapter adapter = new SqlDataAdapter(); SqlComma
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommand SqlCommand = new SqlCommand();
connection.Open();
杀死所有打开的连接将是非常糟糕的:您不知道这些连接在asp.net等多线程代码中正在做什么。直接回答:不,除非您手动跟踪所有连接,否则这是不可能的,但花在跟踪它们上的任何时间都最好花在修复潜在问题上
这里最合适的选择是在使用连接时使用语句添加
。我同意应该从根本上解决问题,因此C代码必须正确处理这些问题,但以防像我的情况那样有可能降级活动生产服务器
我发现我可以使用一个SQL脚本在空闲状态下关闭所有连接,因为超过200分钟对设计糟糕的软件基本上没有影响/问题
我没有从程序中调用它,而是将下面的代码放在SQLServer代理作业的一个步骤中,因此它是从SQLServer本身定期运行的
在我的例子中,我希望确保不要删除一些连接,即来自精心设计的软件或来自SQL Server代理本身的连接。
所有这些“永不接触”连接都通过以下条件进行识别:
DELETE FROM #Who2
最终,一旦您在connectionstring上使用ProgramName NOT IN(“YOURAPPNAME”)正确设置了applicationName,您就可以很容易地排除终止所有连接,除了来自C#应用程序的连接
DECLARE @Now DATETIME
DECLARE @Cmd nvarchar(200)
DECLARE @SpId int
DECLARE @logn nvarchar(30)
DECLARE @pgm nvarchar(max)
SET @Now = GetDate()
CREATE TABLE #Who2(
[SPID] int,
[Status] SysName NULL,
[Login] SysName NULL,
[HostName] SysName NULL,
[BlkBy] SysName NULL,
[DBName] SysName NULL,
[Command] SysName NULL,
[CPUTime] int NULL,
[DiskIO] int NULL,
[LastBatch] SysName NULL,
[ProgramName] SysName NULL,
[SPID2] int NULL,
[RequestId] int NULL)
INSERT #Who2 exec sp_Who2
DELETE FROM #Who2
WHERE Login IN ( 'sa' , 'visora' )
OR HostName='.'
OR ProgramName IN ('Java_Orbiter' , 'Tomcat7_Jsipert2')
OR DBName in ('msdb')
ALTER TABLE #Who2
ADD LastDate DateTime
IF Month(@Now)=1 And Day(@Now)=1
BEGIN
UPDATE #Who2
SET LastDate=
CASE WHEN LastBatch Like '12%'
THEN Cast( Substring(LastBatch,1,5)+ '/'+
Cast(Year(@now)-1 As varchar(4)) +' '+
Substring(LastBatch,7,8) as DateTime)
ELSE
Cast( Substring(LastBatch,1,5)+ '/'+
Cast(Year(@now) As varchar(4))+' ' +
Substring(LastBatch,7,8) as DateTime)
END
END
ELSE
BEGIN
UPDATE #Who2
SET LastDate=Cast( Substring(LastBatch,1,5)+ '/'+
Cast(Year(@now) As varchar(4))+' ' +
Substring(LastBatch,7,8) as DateTime)
END
DECLARE Hit_List CURSOR FOR
SELECT SPID, login, ProgramName FROM #Who2 Where Abs(DateDiff(mi,LastDate,@Now)) > 200
OPEN Hit_List
FETCH NEXT FROM Hit_List into @SpId, @logn, @pgm
WHILE @@FETCH_STATUS=0
BEGIN
SET @Cmd='KILL '+Cast(@SpId as nvarchar(11))+' /* '+@logn +' / ''' + @pgm + ''' */ '
EXEC(@Cmd)
PRINT @Cmd
FETCH NEXT FROM Hit_List into @SpId, @logn, @pgm
END
CLOSE Hit_List
DEALLOCATE Hit_List
DROP TABLE #Who2
GO
我认为最好是处理根本原因(错误代码)而不是结果(打开连接)。我总是使用
语句在中声明我的SqlConnections。这限制了连接的范围,并确保它将在块的末端关闭。如往常一样,声明良好的Marc,+1。