Asw*_*win 5 .net c# multithreading
我有五个线程。他们正在同时将OracleBulkCopy(每个记录100万条)放入同一张表(EXCEL_DATA)中。但是在某个时间点,我遇到了以下错误:
ORA-00604:递归SQL级别1发生错误ORA-00054:资源繁忙并指定了NOWAIT进行获取
我为OracleBulkCopy使用以下代码:
using (OracleConnection con = new OracleConnection(ConnectionString))
{
con.Open();
using (var bulkcopy = new OracleBulkCopy(con, options))
{
OracleTransaction tran =
con.BeginTransaction(IsolationLevel.ReadCommitted);
bulkcopy.DestinationTableName = DestinationTable;
foreach (var mapping in columnMappings)
bulkcopy.ColumnMappings.Add(mapping);
bulkcopy.BulkCopyTimeout = TimeOut.Value;
try
{
bulkcopy.WriteToServer(dataTable);
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
}
}
}
Run Code Online (Sandbox Code Playgroud)
听起来表或某个部分被锁定(在批量复制期间非常合理,特别是因为您有显式事务),并且这会阻止其他插入竞争批量复制。这听起来并不令人惊讶。我能说的最好的事情是......“不要这样做”。特别是,这是一个 IO 密集型操作,您的主要阻塞很可能是网络,次要限制是后端服务器 - 也需要遵守您指定的 ACID 规则。由于这些原因,并行执行这些操作不太可能带来任何显着的性能优势,但很可能因阻塞而导致超时。
所以:不要并行执行这些操作......而是串行执行它们。
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |