Azure - 제한 시간이 만료 된 SqlBulkCopy 예외가 발생했습니다.

azure c# sqlbulkcopy sqlcommand sql-server

문제

vm에서 Azure SQL 데이터베이스 (v12)를 사용하고 있습니다. 나는 두 개의 서로 다른 데이터베이스 인스턴스를 가지고 있습니다 - 하나는 준비를위한 것이고 다른 하나는 생산을위한 것입니다. 나는 스테이징으로부터 데이터를 가져 와서 그것을 버튼 클릭만으로 프로덕션에 삽입하려고합니다. 이 코드는 성공적으로 '때때로'무작위로 성공할 것입니다. 그렇지 않으면 나는 뒤에 오는 과실을 얻고있다 :

대량 복사 예외 유형 : {0} System.Data.SqlClient.SqlException 대량 복사 메시지 : {0} 제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다. 이 오류는 라우팅 대상에 연결을 시도하는 중 발생했습니다. 원래 서버에 연결하는 동안 소요 된 기간은 - [사전 로그인] 초기화 = 1; 핸드 셰이크 = 17; [로그인] 초기화 = 0; 인증 = 0; [사후 로그인] 완료 = 0;

여기에이 작업을 수행하는 데 사용하는 코드가 있습니다. 아마도 내가 보지 못하는 결함이있을 수 있습니다. StringBuilder를 덤프하면 SELECT 쿼리가 작동하고 DELETE 쿼리가 작동하지만 SqlBulkCopy를 사용하여 데이터를 복사하려고하면 오류가 발생하는 것을 볼 수 있습니다. 어떤 도움이라도 대단히 감사하겠습니다. 벌써 많은 행운을 겪은 MSDN 문서를 살펴 보았습니다. - 더 긴 CommandTimeouts를 추가하고 더 긴 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/

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 인스턴스를 만들 때 connectionString externalConnectionString 전달하여 새 연결을 여는 것입니다. 이로 인해 두 테이블 모두 동일한 테이블을 수정하려는 데드락 문제가 발생할 수 있습니다.

기존 연결 externalConnection 을 연결 문자열 대신 SqlBulkCopy 생성자에 전달하려고 시도 했습니까?



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.