c# MySql 存储过程超时

c# MySql stored procedure timeout

我有一个 c# 应用程序,它使用不同的参数多次调用相同的 mysql 存储过程。它被调用了大约 250 次,每次调用大约需要 30 秒才能完成。 在某些情况下,由于某种原因调用需要花费更多时间,并且它会阻止下一个调用从 运行ning 开始,所以我想为存储过程设置一个超时时间,以便在它花费的时间超过 say like 时停止5分钟。这样其他人仍然可以 运行 并且只会跳过花费太多时间的那个。 我尝试使用 mysql 连接的命令超时,但这不会终止 运行ning 存储过程,只会在代码中抛出异常,这并不理想,因为下一次调用将在上一次调用时开始一个还是运行ning.

有没有办法为连接设置 mysql 超时,或者如果花费太多时间就终止 mysql thread/process (sp)?关闭 mysql 命令或连接没有做到,清除连接池也没有帮助。

要终止 运行 存储过程,请使用 MySqlCommand.Cancel(使用用于启动该存储过程的同一 MySqlCommand 对象)。因为 MySqlCommand.ExecuteNonQuery(或 ExecuteReader 等)会阻塞调用它的线程,所以这必须从另一个线程完成。完成此操作的一种方法是使用 CancellationTokenSource,然后注册一个将取消命令的回调:

// set up command
using (var command = new MySqlCommand("sproc_name", connection))
{
    command.CommandType = CommandType.StoredProcedure;

    // register cancellation to occur in five minutes
    using (var cts = new CancellationTokenSource(TimeSpan.FromMinutes(5)))
    using (cts.Token.Register(() => command.Cancel())
    {
        // execute the stored procedure as normal
        using (var reader = command.ExecuteReader())
        {
            // use reader, or just call command.ExecuteNonQuery instead if that's what you need
        }
    }
}