Npgsql - 来自 ConcurrentQueue<T> 的 BulkCopy
Npgsql - BulkCopy from ConcurrentQueue<T>
假设我有这样的方法:
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)"))
{
// Is this what I'm supposed to do?
foreach(Model item in modelQueue)
{
writer.WriteRow(item);
}
}
}
}
}
}
模型具有属性 Guid Id、字符串名称、字符串 Something、字符串 SomethingElse(就像 table)。
我可以使用 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
假设我有这样的方法:
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)"))
{
// Is this what I'm supposed to do?
foreach(Model item in modelQueue)
{
writer.WriteRow(item);
}
}
}
}
}
}
模型具有属性 Guid Id、字符串名称、字符串 Something、字符串 SomethingElse(就像 table)。
我可以使用 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