3

Mongoid にはタイムアウト オプションがありません。
http://mongoid.org/en/mongoid/docs/installation.html

Mongoid に長時間のクエリを強制終了させたい。Mongoid クエリのタイムアウトを設定するにはどうすればよいですか?

私が何もしなければ、Mongoid は以下のように長時間待ちます。

mongo > db.currentOp()

{
    "opid" : 34973,
    "active" : true,
    "secs_running" : 1317, // <- too long!
    "op" : "query",
    "ns" : "db_name.collection_name",
    "query" : {
    "$msg" : "query not recording (too large)"
  },
    "client" : "123.456.789.123:46529",
    "desc" : "conn42",
    "threadId" : "0x7ff5fb95c700",
    "connectionId" : 42,
    "locks" : {
    "^db_name" : "R"
  },
    "waitingForLock" : true,
    "numYields" : 431282,
    "lockStats" : {
    "timeLockedMicros" : {
     "r" : NumberLong(514304267),
     "w" : NumberLong(0)
  },
    "timeAcquiringMicros" : {
     "r" : NumberLong(1315865170),
     "w" : NumberLong(0)
    }
  }
 }
4

3 に答える 3

1

Mongoid の場合、デフォルトのクエリ タイムアウトは通常 60 秒ですが、Ruby のスレッド化により、プロセスを適切にシャットダウンする際に問題が発生する傾向があります。

願わくば、あなたの要求が Mongrels にそのような負担をかけることはありませんが、この問題が続く場合は、アプリケーションの最適化の変更を検討するか、God または Monit を採用することを検討します。あなたがそれに興味がなく、リクエストの処理を変更したい場合は、すでに nginx を使用している場合は Unicorn をお勧めします (github はこの移行を行っており、詳細についてはこちらを参照してください) 。

于 2013-07-31T15:58:18.457 に答える
1

実際、すべてのクエリにはデフォルトでタイムアウトがあります。no_timeoutタイムアウトしないようにクエリを指示するオプションを設定できます。こちらをご覧ください

このように、初期化子を使用してタイムアウト期間を構成できます

Mongoid.configure do |config|
  config.master = Mongo::Connection.new(
    "localhost", 27017, :op_timeout => 3, :connect_timeout => 3
  ).db("mongoid_database")
end
于 2013-07-31T12:51:35.050 に答える
0

この解決策を試してください:

ModelName.all.no_timeout.each do |m|
  "do something with model"
end

https://stackoverflow.com/a/19987744/706022

于 2016-02-01T18:28:26.033 に答える