5

我有五个线程。他们同时在同一张表 (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();
                        }
                    }
                }
4

1 回答 1

4

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

所以:而不是并行地做这些......串联地做它们。

于 2012-09-11T06:52:26.697 回答