异步查询
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