代码之家  ›  专栏  ›  技术社区  ›  Mark Bostleman

L2S实体检索的并行化

  •  0
  • Mark Bostleman  · 技术社区  · 16 年前

    在不能选择延迟加载的情况下,我已经确定了一个约定,即获取一个实体列表并不同时获取每个项的子实体(不加载),但是获取一个实体(急切加载)。

    因此,如果我想得到一个列表,其中每个项目都是儿童充分水合,我结合了GetList和GetItem方法。因此,我将得到一个列表,然后通过它循环得到每个项目的完整级联。即使在我所从事的许多项目中,这也是可以接受的——但我最近遇到了需要更高效的更大模型和/或更多数据的情况。

    我发现对循环进行分区并在多个线程上执行它会产生很好的结果。在我的第一个实验中,我列出了一个特定项目的50个项目,我做了5个线程,每个线程10个项目,在时间上提高了3倍。

    当然,里程数会因项目而异,但在其他条件相同的情况下,这显然是一个很大的机会。然而,在我进一步讨论之前,我想知道其他人做了什么已经经历了这一切。有什么好方法可以并行处理这类事情?

    1 回复  |  直到 16 年前
        1
  •  0
  •   Jeff Meatball Yang    16 年前

    您可以对数据库进行异步调用,以便多个查询并行运行。如果您将此与模型的每个“层”的第一个策略结合起来,并基于多个记录返回集编写一个稍微复杂一些的水合函数,那么您应该会看到数据库能够很好地处理并发连接(这就是为什么您会看到使用多个线程带来的性能提升)。

    但是您不需要显式地创建线程—请查看 asynchronous methods of 一个SqlCommand。