var*_*ble 11 sql-server sql-server-2019
假设应用程序已与 SQL\xc2\xa0Server 建立了两个连接。
\n通过任务管理器终止此应用程序是否会终止两个 SQL 连接?
\nJos*_*ell 24
我使用 Microsoft.Data.SqlClient 驱动程序通过连接到远程网络 SQL Server 实例的 .NET 6 控制台应用程序对此进行了测试。当通过任务管理器终止可执行文件时,连接立即断开。
using Microsoft.Data.SqlClient;
var connectionString = "none of your business";
using (var connection1 = new SqlConnection(connectionString))
using (var connection2 = new SqlConnection(connectionString))
{
connection1.Open();
connection2.Open();
Console.WriteLine("Connections opened, press enter to run a query on one of the connections");
Console.ReadLine();
using var command1 = new SqlCommand("SELECT * FROM master.dbo.spt_values v1 CROSS JOIN master.dbo.spt_values v2", connection1);
var reader1 = command1.ExecuteReader();
while (reader1.Read())
{
var number = reader1.GetInt32(1);
Console.WriteLine($"Reader1 got number {number}");
}
}
Run Code Online (Sandbox Code Playgroud)
当出现此提示时:
连接已打开,按 Enter 键对其中一个连接运行查询
我可以跑
EXEC master.dbo.sp_WhoIsActive
@show_sleeping_spids = 2,
@output_column_list = '[start_time][session_id][sql_text][cpu][wait_info][reads][status][program_name]',
@filter = 'SQL Connection Test',
@filter_type = 'program';
Run Code Online (Sandbox Code Playgroud)
并查看两个连接:
现在,如果我按 Enter 键,则会在一个连接上运行查询,并且我可以运行相同的sp_WhoIsActive查询:
然后我从任务管理器的详细信息选项卡中杀死了 SqlConnectionTest.exe:
单击“结束进程”后,我重新运行 sp_WhoIsActive 查询,两个连接(睡眠连接和活动连接)都消失了(因此,在 1-2 秒内):
using注意:无论块是否存在,此测试的行为都是相同的。
值得指出的是,该测试是基于一个框架和一个驱动程序的示例。此行为在代码框架、驱动程序、操作系统等之间可能有所不同。
如果您的应用程序正在运行的查询执行“SQL Server 外部”的奇怪操作,则会话将在 SQL Server 中持续存在(感谢 AMtwo)。例如,如果我更改上面的示例程序来运行此查询:
xp_cmdshell 'ping 127.0.0.1 -n 30 > nul';
Run Code Online (Sandbox Code Playgroud)
即使我终止了应用程序,该会话也会保持打开状态 30 秒(当对 cmd 的外部调用完成时)。
Cha*_*ace 17
假设您正在使用完整的任务终止:这基本上取决于 SQL Server 是否收到有关连接被删除的任何通知。
如果操作系统发送 TCPFIN或RST数据包,那么 SQL Server 可能会立即终止连接。Windows 10 上的轶事测试表明操作系统会RST自动发送数据包。显然,如果你拔掉电源或网络,那么RST数据包将不会被发送。
否则,SQL Server不一定会立即终止连接,因为就服务器而言,客户端只是没有响应,类似于网络连接失败时会发生的情况。
如果客户端在一定时间内没有响应,服务器最终会导致连接超时。
请注意,这仅指连接,会话通常也会被终止,即使客户端唤醒也无法恢复。需要召开新的会议。但在某些情况下,即使没有与之关联的连接,会话也可以保留下来,例如在回滚会话或cmd发出外部命令时。