代码之家  ›  专栏  ›  技术社区  ›  Jebathon

C-查询仍在SQL Server数据库中运行,即使commandTimeout设置为在设置的时间后终止查询

  •  2
  • Jebathon  · 技术社区  · 7 年前

    在我的C代码中,我使用的是 CommandTimeout 函数确保从服务器和数据库终止执行时间超过30秒的任何查询。但是,当列出数据库上当前正在运行的查询时,设置为30秒后取消的查询 运行时间超过30秒

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        SqlCommand sqlCommand = new SqlCommand(query, connection);
    
        //Set Timeout to 30s
        sqlCommand.CommandTimeout = 30;
        SqlDataAdapter da = new SqlDataAdapter(sqlCommand);
    
        da.Fill(response);
        connection.Close();
        da.Dispose();
    }
    

    enter image description here

    为什么查询仍在数据库中运行?我现在唯一的选择是在30秒后从服务器发送另一个查询来终止查询(kill[session_id])?

    编辑: 正在为此查询返回300MB的数据。

    1 回复  |  直到 7 年前
        1
  •  1
  •   StriplingWarrior    7 年前

    有一个 number of posts 在stackoverflow上指示 SqlCommand.CommandTimeout 不会影响 SqlDataAdapter.Fill . 相反,您应该设置sqldataadapter的 SelectCommand.CommandTimeout 属性。

    但是,有 other 似乎表明即使这样也不起作用的帖子。 This one 特别是,我认为只有当超时发生在查询开始产生结果之前,查询才会被取消。一旦结果开始出现,它似乎会忽略所有超时。

    我的建议是重新考虑使用sqldataadapter。根据您的用例,也许像dapper这样的库对您更有用?

    您也可以考虑将此作为缺陷报告给.NET团队。我在过去报告这些错误时取得了好坏参半的成功;这取决于团队是否希望优先解决问题。

    更新

    MarcGravell指出,这可能是预期的、有据可查的行为。 here .

    LOL:来自文档 ( https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v=vs.110).aspx )

    例如,如果读取需要两个网络,30秒超时 包,然后它有30秒的时间来读取两个网络包。如果你 再次调用read,它将有30秒的时间来读取 它需要。

    所以:这个超时每次读取都会自动重置。所以:只有这样才能旅行 如果任何单个读取操作花费的时间超过2秒,只要 SQL Server在该时间内设法将至少一行放到管道上: 它不会通过任何API超时。