具有多个线程的OracleBulkCopy

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)

Mar*_*ell 4

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

所以:不要并行执行这些操作......而是串行执行它们。