/ / NpgsqlCopyIn schlägt nach Timeout fehl (Einstellung "CommandTimeout" wird ignoriert) - c #, .net, postgresql, timeout, npgsql

NpgsqlCopyIn schlägt nach Zeitüberschreitung fehl (Einstellung "CommandTimeout" wurde ignoriert) - c #, .net, postgresql, timeout, npgsql

Ich habe einen recht großen Datensatz (900K-Datensätze, 140 MB)Speicherplatz) in einer CSV-Datei in einer Client-App (.NET 4.0) gespeichert. Ich muss diese Daten auf dem schnellsten Weg in Postgres 9 db laden. Ich verwende die Npgsql "NpgsqlCopyIn" -Technik (Npgsql-Bibliotheksversion = 2.1.0).

Bei einer Sondenlast (138K) funktioniert das Einfügen gut - es dauert etwa 7 Sekunden. Für den gesamten Stapel (900 KB) löst der Code jedoch eine Zeitüberschreitungsausnahme aus:

  "ERROR: 57014: canceling statement due to statement timeout"

Die Stapelverfolgung ist:

Npgsql.NpgsqlState.d_9.MoveNext () um Npgsql.NpgsqlState.ProcessAndDiscardBackendResponses (NpgsqlConnector) context) um Npgsql.NpgsqlCopyInState.SendCopyDone (NpgsqlConnector context) um Npgsql.NpgsqlCopyInState.StartCopy (NpgsqlConnector Kontext, NpgsqlCopyFormat (copyFormat) um Npgsql.NpgsqlState.d_9.MoveNext () um Npgsql.NpgsqlState.ProcessAndDiscardBackendResponses (NpgsqlConnector) Kontext) um Npgsql.NpgsqlConnector.ProcessAndDiscardBackendResponses () um Npgsql.NpgsqlCommand.ExecuteBlind () um Npgsql.NpgsqlCopyIn.Start ()

Ich habe versucht, CommandTimeout auf Kilo zu setzenWerte (> 7200), Null; Gleiche Werte für den Parameter "Timeout" der Verbindung versucht. Ich habe auch versucht "CommandTimeout" über die Verbindungszeichenfolge zu setzen, aber immer noch ohne Ergebnis - "ERROR 57014" kommt immer wieder heraus.

Bitte helfen Sie, die Charge richtig zu laden!

Hier ist der Code, den ich verwende:

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();
}
}
}

Antworten:

3 für die Antwort № 1

Npgsql hat einen Fehler bezüglich der Befehlszeitüberschreitung und der Behandlung von NpgsqlCopyIn.

Sie können unseren aktuellen Master testen, bei dem wir viele Korrekturen bezüglich der Befehlszeitüberschreitung hatten.

Sie können eine Kopie des Projekts auf unserer GitHub-Seite herunterladen: https://github.com/npgsql/Npgsql/archive/master.zip

Bitte probieren Sie es aus und lassen Sie uns wissen, ob es für Sie funktioniert.