gpt4 book ai didi

c# - 具有多线程的 OracleBulkCopy

转载 作者:太空狗 更新时间:2023-10-29 23:24:51 27 4
gpt4 key购买 nike

我有五个线程。他们正在同时将 OracleBulkCopy(每个 100 万条记录)复制到同一个表 (EXCEL_DATA) 中。但是在某个时间点我遇到了以下错误:

ORA-00604: error occurred at recursive SQL level 1 ORA-00054: resource busy and acquire with NOWAIT specified

我正在为 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();
}
}
}

最佳答案

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

所以:不要并行执行这些...串行执行。

关于c# - 具有多线程的 OracleBulkCopy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12364096/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com