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です。