0
에서의 나는 이런 방법이 있다고 가정 해 봅시다.Npgsql 대량 복사는 ConcurrentQueue <T>
WriteRow()를 사용하고 전체 개체를 전달할 수 있습니까? 이 구현 방식은 갈 것인가 아니면 잘못하고 있습니까?
에서의 나는 이런 방법이 있다고 가정 해 봅시다.Npgsql 대량 복사는 ConcurrentQueue <T>
WriteRow()를 사용하고 전체 개체를 전달할 수 있습니까? 이 구현 방식은 갈 것인가 아니면 잘못하고 있습니까?
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입니다.