2010-04-24 42 views
0

假设与SQL Server和一个DBML一个典型的域实体接近/ L2S DAL与最重要的是一个逻辑层:并行化L2S实体检索

在的情况下的延迟加载是不是一种选择,我已经在结算约定,其中获取实体列表并不会获得每个项目的子实体(不加载),但是获取单个实体(急切加载)。

由于获得单个实体也会得到孩子,它会导致一个级联效应,其中每个孩子也会得到它的孩子。这听起来很糟糕,但只要模型不太深,我通常不会看到超过易用性好处的性能问题。

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

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

当然,里程会因项目而异,但其他条件相同时,这显然是一个很大的机会。但是,在我进一步讨论之前,我想知道其他人已经完成了哪些工作已经完成了。并行化这种类型的东西有什么好方法?

回答

0

通常,创建一个返回一组记录的单个数据库调用会更快。

此记录集可以“保湿”顶层对象,然后另一个记录集可以加载子对象。我不确定你的情况如何不允许延迟加载,但这种方法本质上是延迟加载,并且肯定会比每次对数据库进行多次调用都会返回单个记录的速度更快。

您可以对数据库进行异步调用,以便多个查询并行运行。如果将此与模型的每个“层”的第一个策略结合起来,并根据多记录返回集写出更复杂的水合函数,您应该会看到数据库处理并发连接的效果非常好(这就是您看到的原因使用多个线程的性能增益)。

但是你不需要明确地创建线程 - 检查出一个SqlCommand的asynchronous methods of

+0

杰夫,感谢您的回复。不知道我们在同一页上。我正在做一个单一的数据库调用,返回一组记录。这个问题与每条记录的细节和每条记录的细节等有关。它就像一个金字塔。 – 2010-04-24 16:36:51

+0

实际上,我能得到的唯一列表是最上面的一个 - 其余的必须是一个,除非我放弃在数据库中进行连接,在这种连接中许多表(又名实体)被合并为一个非规范化结果。但是,如果我在DAL中这样做了,它会打破每个实体的孤立映射,并绕过它们的逻辑层,从而打开一堆完全不同的蠕虫。这个问题似乎是数据驱动与域驱动方法的基本紧张\权衡。 – 2010-04-24 16:37:27