具有多个线程的OracleBulkCopy

时间:2012-09-11 06:43:17

标签: c# .net multithreading

我有五个主题。他们同时在同一个表(EXCEL_DATA)中执行 OracleBulkCopy (每个100万条记录)。但是在某个时间点我遇到了错误:

  

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();
                        }
                    }
                }

1 个答案:

答案 0 :(得分:4)

听起来像表或部分被锁定(在批量复制期间非常合理,特别是因为您有明确的事务),并且阻止了竞争批量复制的其他插入。这听起来并不令人惊讶。我能说的最好的事情是......“不要那样做”。特别是,这是一个IO绑定操作,您的主要阻塞很可能是网络,次要限制是后端服务器 - 这也是必需来遵守ACID规则已经指定。出于这些原因,并行执行这些操作不太可能带来任何显着的性能优势,但 非常 可能会因阻塞而导致超时。

所以:不要并行地做这些......而是串联起来。