3

在我的程序中,我使用任务并行库来减少进程的时间。我使用这段代码来完成这项工作。

Task[] tasks = new Task[10]
{
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 1 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 2 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 3 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 4 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 5 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 6 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 7 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 8 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 9 , (e.Argument as string[])[1])),
    Task.Factory.StartNew(() => DoFiles(fullNum,NotFullNum, 10, (e.Argument as string[])[1]))
};

Task.WaitAll(tasks);

DoFiles() 方法处理一些文件,然后在数据库中的文件中插入单词。每个任务处理一些文件。我使用此代码插入数据库:

SqlBulkCopy sbc = new SqlBulkCopy(clsGlobal.cnTashih);
sbc.DestinationTableName = "tblListTekrari_3";
sbc.BulkCopyTimeout = 0;
sbc.WriteToServer(dtT);
sbc.Close();

当我运行程序时,有时会出现此错误:

Cannot access destination table 'tblListTekrari_3'.

System.Data

The request failed to run because the batch is aborted, this can be caused by abort signal sent from client, or another request is running in the same session, which makes the session busy.

at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternal()
at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServer(Int32 columnCount)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table)
at tashih.frmStart.DoFiles(Int32 countFull, Int32 NotCountFull, Int32 part, String ProjectID)

有谁能够帮我?

4

1 回答 1

1

使用并行批量复制将数据复制到特定分区

使用并行批量复制将数据并行复制到特定分区。并行大容量复制可显着提高 bcp 会话期间的性能,因为它可以将大型大容量复制作业拆分为多个会话并同时运行这些会话。

要使用并行批量复制:

  • 目标表必须是分区的。

使用 sp_helpartition 查看表上的分区数。

如果表尚未分区,请使用 alter table ... partition 对表进行分区。

  • 目标表不应包含索引,因为:

如果表具有聚集索引,则该索引确定数据的物理位置,从而导致 bcp 命令中的分区规范被忽略。

如果存在任何索引,bcp 会自动使用其慢速大容量复制而不是其快速大容量复制模式。

  • 如果表上存在非聚集索引,并行大容量复制很可能导致索引页死锁。
  • 为了获得最佳性能,每个分区都应驻留在单独的物理磁盘上。
  • 在将数据复制到数据库之前,请对要包含数据的表进行分区。
  • 并行批量复制可以从多个操作系统文件复制到一个表中。

对于所有类型的分区表,请使用:

bcp tablename partition partition_name in file_name

仅对于循环分区表,使用:

bcp 表名 partition_number in file_name

于 2013-08-27T05:36:48.690 回答