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
}
}
}
我有一个 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
}
}
}