我运行以下代码来捕获任何可能挂起的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相关的信息。

10-05 20:31
查看更多