我有一个API调用,它使用来自10个底层表的数据。它们是不相关的(没有连接),但都在同一个UI视图上使用,因此只有一个API调用来获取数据。
问题是,EF Core只允许每个DbContext
执行1次查询,因此每个查询都在等待并并行运行。每个数据库任务需要100-150毫秒,因此总时间约为2秒。问题是他们只是从视图的不同表中获取请求。它们没有理由不能在逻辑上并行运行。
建议似乎是创建多个DbContext
,但示例化其中的10个似乎很荒谬。
其他人说要直接使用SQL,但它们又是不相关的表,感觉也很混乱。
1条答案
按热度按时间dsekswqp1#
如果一些被拉取的数据是用于诸如用于填充下拉列表的查找表之类的东西,那么您可以通过缓存来减轻一些这种情况,例如使用Singleton LookupProvider,它可以公开检查其本地缓存的查找集合如果本地缓存尚未被读取或已经过期,则将数据加载到缓存中并提供该缓存。最坏的情况是,这不一定是并行运行的,但这意味着大多数调用甚至不需要DB调用来检索一些所需的数据。可能改变该查找数据的视图可以指示LookupProvider在该点处使其用于该查找的缓存过期/重新加载。
否则,是的,每个并行操作一个DbContext;一点都不荒谬:)注入DbContextFactory或Unit of Work模式,以便并行操作可以轻松地范围和处置其自己的专用DbContext示例以读取所需的数据。DbContexts被设计为根据需要进行示例化和释放。为了减少时间和资源,请确保尽可能考虑投影到POCO类(ViewModel/DTO),而不是加载和引用分离的实体。