NpgsqlCopyIn因超时而失败(" CommandTimeout"忽略设置)

时间:2014-03-31 13:02:03

标签: c# .net postgresql timeout npgsql

我在客户端应用程序(.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();
        }
    }
}

1 个答案:

答案 0 :(得分:3)

Npgsql有关于命令超时和NpgsqlCopyIn处理的错误。

您可以测试我们当前的主服务器,其中有很多关于命令超时处理的修复。

您可以在我们的GitHub页面下载该项目的副本:https://github.com/npgsql/Npgsql/archive/master.zip

请试一试,如果它适合您,请告诉我们。