非同期クエリ
Overview
このガイドでは、Mongoid で非同期クエリを実行する方法を学習できます。 バックグラウンドでデータベースクエリを非同期に実行できます。これは、アプリケーションが複数のコレクションからドキュメントを取得する場合に役立ちます。
非同期クエリの実行
非同期クエリをスケジュールするには、次のコードに示すように、Criteria
インスタンスで load_async
メソッドを呼び出します。
@active_bands = Band.where(active: true).load_async @public_articles = Article.where(public: true).load_async
上記のコードはクエリを非同期実行用にスケジュールします。 その後は、同期クエリの場合と同様に、 ビューでクエリの結果にアクセスできます。
非同期実行用にクエリをスケジュールした場合でも、呼び出し元のスレッドで同期的に実行される可能性があります。 次のリストでは、この状況が発生する可能性のあるシナリオを説明しています。
Mongoid がスケジュールされた 非同期タスクを完了すると、結果を返します。
Mongoid がタスクを開始しても完了しない場合、呼び出し元のスレッドは Mongoid がタスク を完了するまでブロックします。
Mongoid がまだタスクを開始していない場合は、実行キューから削除され、Mongoid は呼び出し元のスレッドでクエリを同期的に実行します。
注意
load_async
メソッドは Criteria
オブジェクトを返しますが、クエリ結果にアクセスする以外の、このオブジェクトに対して操作を実行しないでください。 Mongoid は load_async
を呼び出した後すぐにクエリを実行するようにスケジュールされているため、Criteria
オブジェクトへのその後の変更は適用されない可能性があります。
クエリ パフォーマンスを設定する
非同期クエリはデフォルトで無効になっています。 非同期クエリが無効になっている場合、load_async
メソッドは必要に応じてブロックしながら、現在のスレッドでクエリを直ちに実行します。 したがって、この状況で Criteria
インスタンスで load_async
を呼び出す方法は、クエリの実行を強制するために to_a
メソッドを呼び出す方法と同様です。
非同期クエリ実行を有効にするには、次の構成オプションを設定する必要があります。
development: ... options: # Execute asynchronous queries using a global thread pool. async_query_executor: :global_thread_pool # Number of threads in the pool. The default is 4. # global_executor_concurrency: 4
詳細情報
アプリケーションで Mongoid を構成する方法の詳細については、 「アプリケーション構成ガイド」を参照してください。