首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c# MySql存储过程超时

问c# MySql存储过程超时
EN

Stack Overflow用户
提问于 2019-12-29 20:11:54
回答 1查看 373关注 0票数 1

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-29 23:51:20

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

代码语言:javascript
复制
// 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
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59519281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档