我运行以下代码来捕获任何可能挂起的sql语句。在尝试测试这一点时,我编写了一个经过优化的SQL语句,它需要一分钟的时间来运行。我在activerecord execute sql语句周围放置了一个20秒的超时包装器,但它似乎不会因为太长时间而中断sql调用。这是针对Oracle数据库运行的。
start_time = Time.now
Timeout.timeout(20) do #20 timeout for long running sql
@connection.connection.execute(sql_string)
end
total_sql_time = Time.now - start_time
puts "Sql statement took #{total_sql_time} seconds
输出
Sql statement took 64 seconds
最佳答案
(只是猜测……)
ruby的Timeout.timeout()
的操作方式可能与equivalent function in PHP基本相同,也就是说,它计算ruby中执行的时间,并在等待数据库查询运行、等待完成读取或写入文件、等待网络请求完成时停止计算,等等-也就是说,等待任何与IO相关的信息。