终止应用程序会终止 SQL 连接吗?

var*_*ble 11 sql-server sql-server-2019

假设应用程序已与 SQL\xc2\xa0Server 建立了两个连接。

\n
    \n
  1. 会话正在主动运行查询
  2. \n
  3. 会话正在休眠,等待下一条指令
  4. \n
\n

通过任务管理器终止此应用程序是否会终止两个 SQL 连接?

\n

Jos*_*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)

并查看两个连接:

sp_WhoIsActive 结果的屏幕截图显示两个空闲连接

现在,如果我按 Enter 键,则会在一个连接上运行查询,并且我可以运行相同的sp_WhoIsActive查询:

sp_WhoIsActive 结果的屏幕截图显示两个连接,其中一个具有可运行的查询,正在累积 CPU 和读取

然后我从任务管理器的详细信息选项卡中杀死了 SqlConnectionTest.exe:

当我选择终止该程序时任务管理器中的“您确定吗”对话框的屏幕截图

单击“结束进程”后,我重新运行 sp_WhoIsActive 查询,两个连接(睡眠连接和活动连接)都消失了(因此,在 1-2 秒内):

sp_WhoIsActive 结果的屏幕截图显示没有返回任何行

using注意:无论块是否存在,此测试的行为都是相同的。


值得指出的是,该测试是基于一个框架和一个驱动程序的示例。此行为在代码框架、驱动程序、操作系统等之间可能有所不同。


如果您的应用程序正在运行的查询执行“SQL Server 外部”的奇怪操作,则会话将在 SQL Server 中持续存在(感谢 AMtwo)。例如,如果我更改上面的示例程序来运行此查询:

xp_cmdshell 'ping 127.0.0.1 -n 30 > nul';
Run Code Online (Sandbox Code Playgroud)

即使我终止了应用程序,该会话也会保持打开状态 30 秒(当对 cmd 的外部调用完成时)。

  • 值得注意的是,拔掉网线、切断电源或蓝屏不会终止 TCP 连接。SQL Server 不会立即注意到它的对等点已经消失。 (3认同)

Cha*_*ace 17

假设您正在使用完整的任务终止:这基本上取决于 SQL Server 是否收到有关连接被删除的任何通知。

如果操作系统发送 TCPFINRST数据包,那么 SQL Server 可能会立即终止连接。Windows 10 上的轶事测试表明操作系统会RST自动发送数据包。显然,如果你拔掉电源或网络,那么RST数据包将不会被发送。

否则,SQL Server不一定会立即终止连接,因为就服务器而言,客户端只是没有响应,类似于网络连接失败时会发生的情况。

如果客户端在一定时间内没有响应,服务器最终会导致连接超时。

请注意,这仅指连接会话通常也会被终止,即使客户端唤醒也无法恢复。需要召开新的会议。但在某些情况下,即使没有与之关联的连接,会话也可以保留下来,例如在回滚会话或cmd发出外部命令时。