我有一个c#应用程序,它使用不同的参数多次调用同一个mysql存储过程。它被调用了大约250次,每次调用大约需要30秒才能完成。在某些情况下,由于某些原因,一个调用需要更多的时间,并且会阻止下一个调用的运行,所以我想为存储过程设置一个超时,使其在超过5分钟后停止。这样,其他的仍然可以运行,并且只会跳过花费太多时间的那一个。我尝试使用mysql连接的超时命令,但这并没有杀死正在运行的存储过程,只是在代码中抛出了一个异常,这是不理想的,因为下一个调用将在前一个调用仍在运行时启动。
有没有办法为连接设置mysql超时,或者如果花费太多时间就终止MySQL线程/进程( sp)?关闭mysql命令或连接并没有做到这一点,清除连接池也没有帮助。
发布于 2019-12-29 23:51:20
要终止正在运行的存储过程,请使用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
}
}
}https://stackoverflow.com/questions/59519281
复制相似问题