命令超时后终止查询

问题描述 投票:0回答:1

在命令超时后,我试图在postgresql数据库上杀死由ADO.NET命令触发的查询:

using (var command = new PgSqlCommand("public.timeout_test", connection))
{
    command.CommandTimeout = 10; 
    command.CommandType = CommandType.StoredProcedure;

    connection.Open();
    command.ExecuteNonQuery();
}

在dotnet代码中,超时异常正在被抛出,但我想知道为什么由timout_test函数触发的查询仍然处于活动状态。如果我在查询下运行,则timeout_tets执行的查询将列为活动:

SELECT * FROM pg_stat_activity where state = 'active';

试图用devart和npgsql连接器测试它,但是它们都以相同的方式运行,所以我认为它的目的是行为,但不明白原因。还想询问是否有一种方法可以在命令超时后终止查询。

c# postgresql npgsql devart
1个回答
0
投票

至少在Npgsql中,CommandTimeout实现为客户端套接字超时:在一定时间后Npgsql将只关闭其侧面的网络套接字。这不会取消查询服务器端,它将继续运行。

您可以设置PostgreSQL statement_timeout参数,使其终止运行超过给定时间的查询;为了获得最佳结果,请将statement_timeout设置为低于CommandTimeout的值 - 这将确保在客户端超时之前发生服务器超时,保留连接并将服务器超时作为常规异常传输到客户端。

另一种选择是通过调用NpgsqlCommand.Cancel()手动触发客户端的取消。您可以随时执行此操作(例如,当用户单击按钮时),但与statement_timeout相反,它显然只有在网络启动时才有效。

© www.soinside.com 2019 - 2024. All rights reserved.