SQL Server 2008 R2에 대한 재 시도 가능한 SQLBulkCopy

.net c# sqlbulkcopy sql-server sql-server-2008-r2

문제

나는 기본적으로 데이터베이스 배경과 새로운 .net 물건입니다. 제 질문이 어리석은 짓이라면 저와 함께 견뎌주십시오.

한 SQL Server에서 다른 SQL Server로 데이터를 전송하기 위해 내 코드에서 SqlBulkCopy를 사용하고 있습니다. 그러나 네트워크 문제로 인해 자주 실패하고 있습니다. 나는 두 가지 일을 할 계획을 피하기 위해

  1. 배치 크기 (5000에서 1000)를 줄이고 시간 초과를 늘리십시오 (3 분에서 1 분까지)

  2. 재시도 논리 구현

내 질문은

  1. 재 시도를 구현하는 가장 좋은 방법은 무엇입니까 (테이블 레벨 또는 배치 레벨에서 가능하면 가능)?
  2. SQL Azure에 대한 몇 가지 프레임 워크를 발견했습니다. https://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50).aspx SQL Server 2008 R2와 비슷한 점이 있습니까?

내가 사용하고있는 샘플 코드 :

  private void BulkCopyTable(string schemaName, string tableName)
    {using (var reader = srcConnection.ExecuteReader($"select * from [{SourceDBName}].[{schemaName}].[{tableName}]"))
            {
                const SqlBulkCopyOptions bulkCopyOptions = SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers |
                                                           SqlBulkCopyOptions.KeepNulls | 
                                                           SqlBulkCopyOptions.KeepIdentity;

                using (var bcp = new SqlBulkCopy(dstConnection.ConnectionString, bulkCopyOptions))
                {
                    const int threeMinutes = 60*3;
                    bcp.BulkCopyTimeout = threeMinutes; //Timeout is for a single batch
                    bcp.BatchSize = 5000;
                    bcp.DestinationTableName = $"[{DestinationDB}].[{schemaName}].[{tableName}]";
                    bcp.EnableStreaming = true;
                    foreach (var col in table.Columns.Cast<Column>().Where(c => !c.Computed))
                    {
                        bcp.ColumnMappings.Add(col.Name, col.Name);
                    }
                    bcp.WriteToServer(reader);
                }
            }
        }

인기 답변

간단한 접근 방법은 다음과 같습니다.

  1. 직접 배치를 구현하십시오. 따라서 SqlBulkCopy 가 각 WriteToServer 호출에 대한 메타 데이터를 쿼리해야하므로 비효율적입니다. 배치를 너무 작게 만들지 마십시오. 실험.
  2. 임시 테이블 ( #temp 테이블은 아니지만 연결을 끊고 계속할 수있는 영구 테이블)에 삽입하십시오.
  3. 그런 다음, 임시 테이블에서 실제 테이블로 행을 이동하는 마지막 단계로 insert...select 를 실행하십시오.

이 댄스는 작업을 재시도 가능한 배치로 분할하지만 하나의 트랜잭션 인 것처럼 작동합니다.

원 자성이 필요하지 않은 경우 단계 (1)에서 나올 수 있습니다.



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