Pau*_*ith 8 .net c# timeout sqlbulkcopy sql-server-2008
我需要计算来自SqlBulkCopy的顺序超时异常.为了测试这一点,我使用外部应用程序启动事务并锁定目标表.
只有在第一次调用时,SqlBulkCopy会在预期时抛出超时异常.我们尝试过使用外部连接和事务,以及使用连接字符串和内部事务.使用外部连接和事务,无限等待从未打开连接或开始或提交事务,但总是在.WriteToServer()
.
是否有一些方法SqlBulkCopy.WriteToServer()
可以在达到.BulkCopyTimeout
极限时可靠地抛出超时异常?
public void BulkCopy(string connectionString, DataTable table, int bulkTimeout)
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(
connectionString,
SqlBulkCopyOptions.UseInternalTransaction))
{
bulkCopy.BulkCopyTimeout = bulkTimeout;//e.g. 120 sec.
//... fill with data, map columns...
bulkCopy.WriteToServer(table);
// ^^^^ waits indefinitely, doesn't throw until *after*
// the lock is released.
}
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢让异常冒泡而不是在using
块的范围内处理它们,但我总是可以重新抛出.非常感谢任何见解.
更新1:
仍然没有决议.虽然发现了有趣的行为 - 正常的SqlCommand会在同一个锁中抛出一个TimeoutException,导致SqlBulkCopy.WriteToServer方法无限期挂起.
以下是我们尝试过的方法 - 这些方法都失败了 - 让SqlBulkCopy.WriteToServer在预期时始终如一地抛出超时:
现在,作为一种解决方法,我交替使用a)将WriteToServer调用放在异步包装器中,以便我自己计时,b)只调用WriteToServer一次; 超时后,等到常规SqlCommand 成功再次尝试WriteToServer之前.使用这些方法,我至少能够控制执行流程.
您是否尝试过将 SqlBulkOptions.TableLock 选项传递给 SqlBulkCopy?该选项(引用)意味着它将:
在大容量复制操作期间获取大容量更新锁。
因此,如果有另一个处理锁定表,它将阻止获得锁定,并且理论上可靠地超时。
更新:
我设置了自己的测试工具,但无法重现。为了锁定表,我在 SSMS 中启动了一个事务,执行SELECT * FROM TargetTable WITH (HOLDLOCK)
. 我使用了您在问题中包含的相同 BulkCopy 方法,使用内部事务,批量加载超时为 30 秒。每次尝试进行大容量复制都会在 30 秒后按预期超时。然后当我回滚 SSMS 事务时它会成功。
我使用的是 SQL Server 2008 Express、.NET 3.5。
这不是第一次尝试后,批量加载超时没有正确传递?即它没有以某种方式被设置为“无限期”。
更新 2:
还在连接字符串中打开了多活动结果集支持,每次我仍然总是超时。
归档时间: |
|
查看次数: |
9487 次 |
最近记录: |