2016-04-17 10 views
1

Wir haben Postgres als unsere Back-End-Datenbank. Unser Prozess führt einen Job aus (d. H. Er fügt etwas in die DB ein) und dann für eine Stunde schlafen.Verbindung im Leerlauf in Postgres verursacht Prozess stecken geblieben oder Fehler

Das was wir bemerkt haben. Während der Zeit, in der unser Prozess schläft, wird unser Postgres-Verbindungsstatus als Leerlauf angesehen.

postgres 5045 0.3 0.4 231220 33780 ?  Ss 12:13 0:16 postgres: scp scp_test x.x.x.x(60400) idle  

Jetzt ist meine Frage?

Wenn ich einen Prozess habe, Schlaf für eine Stunde.

Schließt Postgres nach einiger Zeit die Verbindung im Leerlauf?

Da auf dem nächsten ausgeführt wird, kann der Prozess keinen Datensatz in DB einfügen/aktualisieren.

Hier, wie mein Code aussieht.

$logger = Logger.new('log/checker.log') 
    last_modified = Time.now 
    while 
    if (last_modified == File.mtime(file_path)) 
     $logger.info "Sleeping for 1 hour" 
     sleep 3600 
    else 
     $logger.info "Inserting the file mtime changed .." 
     last_modified = File.mtime(file_path) 
     $logger.info "File modified ....." 
     attributes = Test.testFile(file_path) 
     index = 0 
     $logger.info "........Index set......" 
     header_attributes = attributes.shift 
     $logger.info "...........Header removed..........." 
     trailer_attributes = attributes.pop 
     $logger.info "...Trailer removed......." 
     count = attributes.count 
     $logger.info "............Count calculated #{count} ........." 
     attributes.each_slice(50000) { |records| 
     _records = initialize_records(records) 
     _records.each { |record| 
      record.save 
      index += 1 
      $logger.info "Inserting ...... [#{index}/#{count}]" 
     } 
    } 
    $logger.info "Completed insertion of #{count}" 
    end 
end 

diese Getestet mit

Ruby-2.2.2 - ActiveRecord-4.2.6 - pg-0.18.0 
Ruby-2.3.0 - ActiveRecord-4.2.6 - pg-0.18.0 
Jruby-9.0.5.0 - ActiveRecord-4.2.6 - activerecord-jdbc-adapter 

Postgres Version.

PostgreSQL 9.4.5 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit 
(1 row) 

Es gibt 1 Unterschied zwischen Ruby und JRuby Ausgabe?

Während beide Prozesse stecken, nachdem sie aus dem Schlaf aufwachen

Die Ruby-Prozess stirbt mit PG::UnableToSend: SSL SYSCALL error: EOF detected Fehler

aber JRuby Prozess für immer hängen bleibt (nicht stirbt).

Ich bin mir nicht sicher, wo das Problem liegt, da ich an keiner Stelle eine spezifische Bibliothek oder einen bestimmten Code angeben kann.

Hinweis: Funktioniert perfekt auf einer Loopback-Schnittstelle. Der fragliche Postgres-Server ist remote.

Antwort

0

Innerhalb des Datenordners gibt es eine Datei namens postgresql.conf, die Sie konfigurieren müssen, um die Nachricht keepalive an den Client zu senden. Lesen Sie this für weitere Informationen.

konfigurieren postgresql.conf

Ihre postgresql.conf Datei eine Zeile wie diese tcp_keepalives_idle haben sollte. Wenn Sie die Nachricht keepalive für alle 5 Minuten an den Clientcomputer senden möchten; Aktualisieren tcp_keepalives_idle Zeile wie diese

tcp_keepalives_idle = 300

Stellen Sie sicher, dass die Zeile Kommentar- durch die # Markierung entfernen.

+0

Wenn dies ein Problem mit Keepalive ist, warum sehe ich keine Zeitüberschreitung und es funktioniert perfekt auf einer Loopback-Schnittstelle.Ich bin mir ziemlich sicher, dass die Loopback-Verbindung über * TCP-Socket * und ** nicht ** * Unix-Socket * funktioniert, da ich das Paket über TCP über * tcpdump * schnüffeln kann. – Viren

+0

Dies ist eine gute Antwort, würde vorschlagen, Java-Socket-Timeout auschecken. kann nicht erklären, warum es funktioniert mit ** lo **, aber vielleicht seine Handhabung so-Timeout anders. habe schon mal veraltete DB-Verbindungssockets mit JRuby gesehen, allerdings niemals localhost, also wäre es interessant, wenn du den Test bestätigen könntest und bestätigst, was läuft (mit Timeouts). – kares