2017-05-11 8 views
0

에서의 나는 이런 방법이 있다고 가정 해 봅시다.Npgsql 대량 복사는 ConcurrentQueue <T>

WriteRow()를 사용하고 전체 개체를 전달할 수 있습니까? 이 구현 방식은 갈 것인가 아니면 잘못하고 있습니까?

답변

0

ConcurrentQueue는 IEnumerable을 구현하기 때문에 대기열을 통해 실행하고 데이터를 쓰는 것이 매우 간단합니다.

public async Task BulkCopy(ConcurrentQueue<Model> modelQueue, string connectionString) 
{ 
    while(modelQueue.IsEmpty == false) 
    { 
     try 
     { 
      using(NpgsqlConnection connection = new NpgsqlConnection(connectionString)) 
      { 
       await connection.OpenAsync(); 

       using(var writer = connection.BeginBinaryImport("COPY myTable (Id,Name,Something,SomethingElse) FROM STDIN (FORMAT BINARY)")) 
       { 
        foreach(Model item in modelQueue) 
        { 
         writer.StartRow(); 
         writer.Write(item.Id, NpgsqlTypes.NpgsqlDbType.Uuid); 
         writer.Write(item.Name); 
         writer.Write(item.Something); 
         writer.Write(item.SomethingElse); 
        } 
       } 
      } 
     } 
    } 
} 

이 작업을 수행하는 것 같습니다. 30000 레코드에 필요한 시간은 평균 540ms입니다.