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();
}

Azure - SqlBulkCopy抛出超时过期异常

创建SqlBulkCopy实例时,您正在传递连接字符串externalConnectionString,从而打开一个新连接。这可能会导致两个连接试图修改同一个表时出现死锁问题。

您是否尝试将现有连接externalConnection传递给SqlBulkCopy构造函数而不是连接字符串?