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.
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
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