Azure - SqlBulkCopy抛出超时过期异常
本文关键字:超时 过期 异常 SqlBulkCopy Azure | 更新日期: 2023-09-27 18:12:01
我在虚拟机上使用azure sql数据库(v12)。我有两个不同的数据库实例——一个用于暂存,一个用于生产。我正试图从登台获取数据,并通过单击按钮将其插入生产中。这段代码"有时"会成功,这意味着它会随机成功。否则我将返回错误:
BULK COPY Commit Exception Type: {0}System.Data.SqlClient。SqlException BULK COPY消息:{0}超时。操作完成前的超时时间或服务器没有响应。在尝试连接路由目的地时发生此失败。尝试连接到原始服务器的持续时间为- [Pre-Login] initialization=1;握手= 17;初始化[登录]= 0;身份验证= 0;(Post-Login)完成= 0;
这是我用来完成这个任务的代码,也许有一个我没有看到的缺陷。通过转储StringBuilder,我可以看到SELECT查询工作和DELETE查询工作,但是当我试图使用SqlBulkCopy复制数据时抛出错误。任何帮助都将非常感激。我已经通过了一堆MSDN文档已经没有运气->添加更长的commandtimeout,添加更长的BulkCopyTimeout,并在我的防火墙上重新配置端口。还是没有运气
我使用过的资源:https://social.msdn.microsoft.com/Forums/en-US/1467d64f-69ae-4c1f-91a2-349fc5d514ae/sqlbulkcopy-fails-with-timeout-expired-error?forum=adodotnetdataproviders
https://azure.microsoft.com/nb-no/documentation/articles/sql-database-develop-direct-route-ports-adonet-v12/Timeout expired with SqlBulkCopy
public static object SyncData()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("Internal Connection...");
string internalConnectionString = GetConnectionString("ConnectionString");
using (SqlConnection internalConnection = new SqlConnection(internalConnectionString))
{
internalConnection.Open();
SqlCommand selectCommand = internalConnection.CreateCommand();
selectCommand.CommandTimeout = 180;
try
{
selectCommand.CommandText = "SELECT * FROM dbo.test";
SqlDataReader reader = selectCommand.ExecuteReader();
sb.AppendLine("External Connection...");
string externalConnectionString = GetConnectionString("ExternalConnectionString");
using (SqlConnection externalConnection = new SqlConnection(externalConnectionString))
{
externalConnection.Open();
SqlCommand CRUDCommand = externalConnection.CreateCommand();
CRUDCommand.CommandTimeout = 180;
SqlTransaction transaction = externalConnection.BeginTransaction("test");
CRUDCommand.Connection = externalConnection;
CRUDCommand.Transaction = transaction;
try
{
CRUDCommand.CommandText = "DELETE FROM dbo.test";
sb.AppendLine("DELETE: Number of rows affected = " + CRUDCommand.ExecuteNonQuery());
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(externalConnection, SqlBulkCopyOptions.KeepIdentity, transaction))
{
try
{
bulkCopy.DestinationTableName = "dbo.test";
bulkCopy.BatchSize = 100;
bulkCopy.BulkCopyTimeout = 180;
bulkCopy.WriteToServer(reader);
sb.AppendLine("Table data copied successfully");
transaction.Commit();
sb.AppendLine("Transaction committed.");
}
catch (Exception ex)
{
sb.AppendLine("BULK COPY Commit Exception Type: {0}" + ex.GetType());
sb.AppendLine(" BULK COPY Message: {0}" + ex.Message);
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
sb.AppendLine("Rollback Exception Type: {0}" + ex2.GetType());
sb.AppendLine(" Message: {0}" + ex2.Message);
}
}
finally
{
reader.Close();
}
}
}
catch (Exception ex)
{
sb.AppendLine("Commit Exception Type: {0}" + ex.GetType());
sb.AppendLine(" Message: {0}" + ex.Message);
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
sb.AppendLine("Rollback Exception Type: {0}" + ex2.GetType());
sb.AppendLine(" Message: {0}" + ex2.Message);
}
}
}
}
catch (Exception ex)
{
sb.AppendLine("Commit Exception Type: {0}" + ex.GetType());
sb.AppendLine(" Message: {0}" + ex.Message);
}
}
return sb.ToString();
}
创建SqlBulkCopy实例时,您正在传递连接字符串externalConnectionString
,从而打开一个新连接。这可能会导致两个连接试图修改同一个表时出现死锁问题。
您是否尝试将现有连接externalConnection
传递给SqlBulkCopy构造函数而不是连接字符串?