質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

1回答

288閲覧

Rails5でのスレッド処理からのDBアクセス

RedhairAdventur

総合スコア6

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/05/25 06:11

編集2018/05/25 08:59

現在Rails4のアプリケーションを5.0.07へ移行しております。

コントローラー内でスレッドからActiveRecordの呼び出しを行う
処理があるのですが、実行するとフリーズしてしまいプロセスをkillするしか
なくなるのです。
なにか対処方法はありますでしょうか?

データベースはMySQL5.6,
gemは mysql2 0.5.1
です。

ruby

1Class BookController < ApplicationController 2 3 def index 4 5 categories = Cagegory.where(del_flg: 0).index_by(&:id) 6 7 thread = Thread.new(params[:id]){|id| 8 find_book(id) 9   (略 少し重い処理) 10 } 11 (略 少し重い処理 ) 12 13 @book = thread.value 14 15 end 16 17private 18 19 def find_book(book_id) 20 21 22 Book.connection_pool.with_connection do 23 book = Book.where(id: book_id).first 24 end 25 return book 26 end 27 28 29end 30 31

転載のコードを一部訂正ました。
Railsのコンソールのログも追記します。

Started GET "/XXX/1" for 127.0.0.1 at 2018-05-25 17:35:09 +0900
Parameters: {"id"=>"1"}
Category Load (0.7ms) SELECT categories.* FROM categories WHERE (categories.del_flg = 0)

(ここで終了)

MySQLのgeneral logの結果も同様で
スレッド内で呼び出したクエリは実行されていませんでした。

Rails4のほぼ同じコード(移行用に一部書き換える前のもの)を同じ環境で
動かしたところ特に同じような問題は起きていません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2018/05/25 07:46

回答はしたのですが、Rails5への移行、データベースへの疑い、などいろいろ混ざってしまっています。こういうときの鉄則はひとつずつ潰していくことです。Rails5に移行したいなら移行完了するまではアプリケーションの機能は極力いじらない、アプリケーションログとデータベースのログを確認して問題を切り分ける、など複合原因を作らないようにすることがベストです。
guest

回答1

0

def find_book(book_id) に対して find_book() と引数を渡さずに呼び出しているからではないでしょうか?
なぜスレッドを使っているかは書かれていないのでわかりませんが、デバッグするときは原因をはっきりさせるために、同期呼び出しにして確認するほうが良いと思いますよ。

@book = find_book()

投稿2018/05/25 07:42

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RedhairAdventur

2018/05/25 08:18

回答ありがとうございます。パラメータの件は一部コードを隠そうとしたときの転記のミスです。 スレッドを使う理由は負荷がかかる加工処理があるためで、 並列で動作させています。
mather

2018/05/25 08:21

本当にフリーズしているのか、ログを出して進行状況を確認しましたか?
mather

2018/05/25 09:31

おや、スレッド処理以前で止まってませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問