我想读取一个巨大的目录及其子目录和文件,然后将其写入数据库。一切都很好,但是我在插入数据的表上放置了一个触发器,并更新了另一个表。使用单个sql触发就可以了命令但是
由于主程序中的过程很长,因此不会触发触发器。我正在使用队列出队和backroundworker线程。(C#)
这个问题怎么解决?
我认为触发器工作正常,但是您需要先处理所有数据,然后才能看到触发器效果。因此,我建议您将数据分成较小的部分(批),然后将它们一一插入到数据库中。基本上,选择最适合您的设置的批处理大小,并在迭代中加载数据。
这是一些示例C#代码:
public void ProcessData(String rootDirectory, int batchSize)
{
IEnumerable<string> pathsToProcess = GetPathsToProcess(rootDirectory);
int currentBatch = 0;
while (currentBatch*batchSize < pathsToProcess.Length)
{
// take a subset of the paths to process
IEnumerable<string> batch = pathsToProcess
.Skip(currentBatch*batchSize)
.Take(batchSize);
DoYourDatabaseLogic(batch);
currentBatch++;
}
}
上面的代码将对较小的数据子集执行数据库操作,此后,您的触发器将针对该数据执行。每个批次都会发生这种情况。您仍然必须等待所有批次完成,但是您可以看到已完成批次的更改。
但是,使用这种方法带来了一个值得担心的重要问题:如果某些批次由于某种原因失败,会发生什么?
pathsToProcess
如果单个集合的一个批次/子集失败,则必须还原整个集合的所有更改,则应该组织以上代码以在单个数据库事务中运行,并确保适当地进行回滚。pathsToProcess
不需要将集合完全回滚,我仍然建议在每个批次上使用事务。在这种情况下,您可能需要知道您最后一次成功写入了哪个批处理,以便在要再次处理数据时从中恢复。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句