【问题标题】:Threading-alternatives-Best Approach线程替代方案-最佳方法
【发布时间】:2019-07-17 12:15:54
【问题描述】:

我有一个场景:我需要比较两个数据库之间的 350 个表。所以我们遵循的程序是:

1.在sql中创建350张临时表 2.从数据库中插入数据 3.最后比较每个临时表,找出差异。

在这种方法中: 我们正在使用一个等待到第 1 步结束的线程。 然后下一个线程将等到 2 结束。

所以它花费了太多时间。有什么方法可以做,比如创建一个表加载数据,并行创建第二个并加载,就像不等到最后一样。

更新:这是我的示例代码:

foreach (var bpr in tableDetails)
            {
                var tableName = bpr.TableName;
                ComparisonDataLoadLoadWorkerID(comparisonID, sourceEnvId, targetEnvId, tableName);//creating table and loading from DBs
            }

这里遍历每个表并创建和加载数据。加载完整表数据后进行比较。所以我需要等到上面的foreach结束。我期待的是,如果第一个表正在创建加载数据,并且应该同时创建第二个表和数据加载。所以不需要等到每个表加载结束。 提前感谢您的帮助。

【问题讨论】:

  • 如果你能给我们看一些代码就太好了。
  • 1. 你会比较结构相同的表中的数据吗? 2. 为什么需要临时表?避免锁定表? 3. 在这里给出一点上下文:你为什么需要这个?
  • 部分DBMS能够快速创建snapshots。如果你能做到这一点,那么就不需要复制表:只需制作一个快照,然后比较快照中的表。
  • @mtkachenko:感谢您的回复。仅比较具有相同结构的表中的数据。我们正在从源和目标中获取数据,并插入到临时表中进行比较。比较后,如果没有变化,将检测到变化并插入另一个数据库。

标签: c# sql multithreading parallel-processing


【解决方案1】:

为了这个问题,您可以尝试创建类似(在伪代码中)的内容:

var t = new Task(() => /* code that creates the temp table */ );
var last = t
           .continueWith (p => /* code that inserts the data into it */ )
           .continueWith (p => /* code that compares the data */ );
t.Start();

然后,您可以对所有 350 个表循环执行此操作。

这将实现一些并行性,但请记住,您的瓶颈将是 SqlServer,所以不要期望巨大的影响。

【讨论】:

  • 感谢您的回复。一旦创建了所有临时表,这也将像只发生数据加载一样工作,对吗?
  • 没有。它将创建一个表,然后开始加载数据,然后比较它......当一个表正在创建时,另一个数据可能正在加载。如果您希望仅在创建所有表后才开始数据加载,那么您需要一种不同的方法:1)创建一个任务来创建每个表。 2) 为他们创建任务WhenAll,并使用生成任务以加载数据的任务继续使用它。 3) 做 (2) 但用于比较数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多