私は奇妙なバグの原因を突き止めようとしています。Rails:SQLクエリのプロダクションサーバが永久にハングする
私は(コントローラのアクションによって呼び出される)モデルでのコード行を持っている:予想通り
# it always works
self.deliveries.create(subscriptions.pluck('DISTINCT endpoint').collect {|e| {endpoint: e}})
すべては私のローカルマシン上で、本番サーバー上で、さらに何千ものと(作品配送)。
ブースト性能をするためには私は生のSQLと上記の行を置き換えています
# it hangs forever on the production server if you have many deliveries
inserts = subscriptions.pluck('DISTINCT endpoint').collect do |e|
"(#{self.id}, #{ActiveRecord::Base::sanitize(e)})"
end
ActiveRecord::Base.connection.execute("INSERT INTO deliveries (notification_id, endpoint) VALUES #{inserts.join(', ')}")
でも配達の何千もの私のローカルマシン上で期待通り、この作品。しかし、私の生産サーバー上の(2GB RAM/2コア)この2番目のバージョンは、挿入するレコードがいくつかある場合のみ動作し、それ以外の場合は2000個の配送があるため、要求は永久にハングします。
は、より正確には:- ブラウザが応答とHTTPリクエストが永遠に
- 配達が行は次のデータベース
- に保存されているハング取得していません
execute
は実行されません
コードの3番目のバージョンを使用して、元のSQLをactiverecord-import gemと交換すると、まったく同じバグが発生します。
このバグの原因は何ですか?
私はそれがアプリケーションをクラッシュさせる長い出力メッセージ(大規模なSQLクエリ)(これはlogz.ioを使用している)である可能性があるのか疑問に思っています。
なぜあなたは、このすべてにRailsのが関与していますか? SQLの単純な 'insert into ... select ...'ビットは、より良い出発点でしょうか? –