【发布时间】:2014-03-31 13:02:02
【问题描述】:
我有一个非常大的数据集(900K 记录,140Mb 磁盘空间)存储在客户端应用程序 (.NET 4.0) 的 CSV 文件中。我需要以最快的方式将此数据加载到 Postgres 9 db。我使用 Npgsql "NpgsqlCopyIn" 技术(Npgsql 库版本=2.1.0)。
对于探针负载 (138K) 插入工作正常 - 大约需要 7 秒。 但是整批(900K),代码抛出超时异常:
"ERROR: 57014: canceling statement due to statement timeout"
堆栈跟踪是:
Npgsql.NpgsqlState.d_9.MoveNext() 在 Npgsql.NpgsqlState.ProcessAndDiscardBackendResponses(NpgsqlConnector 上下文)在 Npgsql.NpgsqlCopyInState.SendCopyDone(NpgsqlConnector 上下文)在 Npgsql.NpgsqlCopyInState.StartCopy(NpgsqlConnector 上下文,NpgsqlCopyFormat 复制格式)在 Npgsql.NpgsqlState.d_9.MoveNext() 在 Npgsql.NpgsqlState.ProcessAndDiscardBackendResponses(NpgsqlConnector 上下文)在 Npgsql.NpgsqlConnector.ProcessAndDiscardBackendResponses() 在 Npgsql.NpgsqlCommand.ExecuteBlind() 在 Npgsql.NpgsqlCopyIn.Start()
我尝试将 CommandTimeout 设置为千值(>7200),零;为连接“超时”参数尝试了相同的值。我也试图通过连接字符串设置“CommandTimeout”,但仍然没有结果——“ERROR 57014”一次又一次地出现。
请帮助正确加载批处理!
这是我使用的代码:
private static void pgBulkCopy(string connection_string, FileInfo fiDataFile)
{
using (Npgsql.NpgsqlConnection con = new Npgsql.NpgsqlConnection(connection_string))
{
con.Open();
FileStream ifs = new FileStream(fiDataFile.FullName, FileMode.Open, FileAccess.Read);
string queryString = "COPY schm.Addresses(FullAddress,lat,lon) FROM STDIN;";
NpgsqlCommand cmd = new NpgsqlCommand(queryString, con);
cmd.CommandTimeout = 7200; //7200sec, 120 min, 2 hours
NpgsqlCopyIn copyIn = new NpgsqlCopyIn(cmd, con, ifs);
try{
copyIn.Start();
copyIn.End();
}catch(Exception ex)
{
Console.WriteLine("[DB] pgBulkCopy error: " + ex.Message );
}
finally
{
con.Close();
}
}
}
【问题讨论】:
标签: c# .net postgresql timeout npgsql