2017-05-11 4 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です。