2017-01-11 4 views
0

私は2つのスレッドを持っています。あるスレッドでは、ActiveRecordオブジェクトとしてデータベースからレコードを取得します。私は別のスレッドからこのオブジェクトにアクセスします。Rails 4:別のスレッドのActiveRecordオブジェクトを使用する

この使用方法に問題はありますか? 2つのスレッドがDBへの別々の接続を使用する場合、ARオブジェクトの関連付けなどにアクセスするために必要な場合はどの接続が使用されますか?

さまざまなスレッドからActiveRecordを介してDBに接続するという落とし穴とそのような接続を手動でチェックインする必要があるというStackOverflowに関するいくつかの質問があります。それはこの問題に影響しますか?

+0

どのバージョンのレールを使用していますか?最近スレッドを開始するときにいくつかの変更があったと思います。 –

+0

私はRails 4を使用しています。これらはどのような変更ですか? – CppNoob

答えて

1

正しく聞いたことがあります。 ARを使うときは、物事を安定に保つために奇妙な方法でスレッドを踏ん張る必要があるかもしれません...もしあなたが2つのスレッドしか持っていないという保証があれば、おそらく少なくとも安全ですARと関係があります。 (もちろん、デッドロック、スレッドスターベージョンなどの他のすべての並行処理の落とし穴もそのまま適用されますので、これらを考慮に入れてください)

各スレッドはAR接続を使用しますしたがって、database.ymlのpoolフィールドは、すべてのスレッドを収容できるだけの高さでなければなりません。あなたがPumaのようなスレッドベースのウェブサーバを使用しているなら、これはもっと複雑になる可能性があります...もしあなたがレールの方が新しいなら、スレッドとARを扱うときは注意が必要です。それはかなりウサギの穴である可能性があります。

1つのスレッドがオブジェクトをフェッチし、別のスレッドがそのオブジェクトにアクセスする目的は何ですか?あなたが本当のスピードの利点を期待するなら、それは価値があるかもしれませんが、2番目のスレッド(ARレコードの操作)の動作は最初のスレッドの結果(ARレコードのロード)に左右されるため、最初のスレッドが終了してから2番目のスレッドの使用を開始するまで待つ必要があるため、速度の向上が必要です。あなたのシナリオがオブジェクトをロードした後の最初のスレッドで何もしない場合は、スピードの向上は見られないので絶対に勧めますが、シナリオ全体を知りません。あなたの状況に合ったものにしてください。

要するに、ARでスレッドを使用するのを止めることは何もありませんが、危険です。スレッドの使用が控えめでない限り、バグが奇妙な場所で発生することが予想されます。それはまだかもしれないあなたのアプリのために意味をなさないが、他のソリューションを最初に見て、あなたはスレッドで行く場合は慎重に進んでください。

Re "2つのスレッドがDBへの別々の接続を使用する場合、ARオブジェクトの関連付けにアクセスするために必要な場合にどの接続が使用されるか:各スレッドは独自のAR接続を取得するため、AR結合にアクセスするスレッドは最初にARレコードをロードしたスレッドとは無関係に、独自の接続を確立します。

あなたのアプリでスレッドを使用する動機は何ですか?物事を扱う方が良いかもしれません。

関連する問題