我在客户端应用程序(.NET 4.0)中的CSV文件中存储了一个非常大的数据集(900K记录,140Mb磁盘空间)。我需要以最快的方式将这些数据加载到Postgres 9 db。我使用Npgsql" NpgsqlCopyIn"技术(Npgsql库版本= 2.1.0)。
对于探头负载(138K)插入工作正常 - 它需要大约7个secons。 但对于整批(900K),代码抛出超时异常:
"ERROR: 57014: canceling statement due to statement timeout"
堆栈跟踪是:
Npgsql.NpgsqlState.d_ 9.MoveNext()at Npgsql.NpgsqlState.ProcessAndDiscardBackendResponses(NpgsqlConnector 上下文)在Npgsql.NpgsqlCopyInState.SendCopyDone(NpgsqlConnector) 上下文)在Npgsql.NpgsqlCopyInState.StartCopy(NpgsqlConnector context,NpgsqlCopyFormat copyFormat)at Npgsql.NpgsqlState.d _9.MoveNext()at Npgsql.NpgsqlState.ProcessAndDiscardBackendResponses(NpgsqlConnector 上下文) Npgsql.NpgsqlConnector.ProcessAndDiscardBackendResponses()at Npgsql.NpgsqlCmandIn.Start()
中的Npgsql.NpgsqlCommand.ExecuteBlind()
我尝试将CommandTimeout设置为千位值(> 7200),为零;尝试了相同的连接值" Timeout"参数。我也试图设置" 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();
}
}
}
答案 0 :(得分:3)
Npgsql有关于命令超时和NpgsqlCopyIn处理的错误。
您可以测试我们当前的主服务器,其中有很多关于命令超时处理的修复。
您可以在我们的GitHub页面下载该项目的副本:https://github.com/npgsql/Npgsql/archive/master.zip
请试一试,如果它适合您,请告诉我们。