Timeout di connessione a un database Postgres su Amazon RDS da Azure

Ottengo la seguente eccezione nella mia applicazione, dopo aver lasciato una connessione di database inattivo per un certo tempo:

... An I/O error occured while sending to the backend.; nested exception is org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.] with root cause

    java.net.SocketException: Operation timed out
        at java.net.SocketInputStream.socketRead0(Native Method)

Lo stesso problema accade in psql E non ho problemi di connessione a un database locale, quindi sono abbastanza sicuro che il problema è su RDS.

psql=> select 'ok';
SSL SYSCALL error: Operation timed out
psql=> select 'ok';
SSL SYSCALL error: EOF detected
The connection to the server was lost. Attempting reset: Succeeded.

Ho trovato questo altra domanda che suggerisce un lavoro di tutto per migliorare la situazione (timeout ora prendere un po ‘ di più), ma non risolvere il problema.

Sto usando la Molla di Avvio con JDBC (tomcat pool di connessioni) e JDBCTemplate.

C’è un lavoro di tutto o di una correzione?
Forse forzando il pool di connessioni per test e ricollegare?
Come posso fare in modo che in questo ambiente?

MODIFICA:
Questa è la mia stringa di connessione

jdbc:postgresql://myhost.c2estvxozjm3.eu-west-1.rds.amazonaws.com/dashboard?tcpKeepAlive=true

SOLUZIONE:

Modificato il server RDS lato TCP_KeepAlive parametri come suggerito nella risposta selezionata. I parametri che sto usando sono:

tcp_keepalives_count      5
tcp_keepalives_idle     200
tcp_keepalives_interval 200



3 Replies
  1. 21

    Sembra che qualcosa – forse un router NAT, da parte tua, forse qualcosa su AWS fine è il connection tracking, e dimenticare la connessione dopo un po’.

    Suggerisco abilitare il protocollo TCP keepalive. Si potrebbe essere in grado di consentire loro lato server in AWS RDS configurazione; se non, si può chiedere loro lato client nel driver JDBC.

    TCP keepalive sono molto meglio di una validazione/query di prova, perché sono molto più basso overhead, e non come risultato di registro non necessari spam del server di log di query.

    • Questo sembra aver risolto il problema, da quando ho aggiunto questi pacchetti keep alive presso AWS postgres lato non ho avuto il timeout di più. Io rimuovere le altre cose che ho provato (TCP keepalive sul kernel linux, keepalive la stringa di connessione e connessione convalida del pool di connessione) e vedere se tiene dal proprio.
    • Ciò ha risolto il problema, i parametri che ho usato su RDS sono modificati domanda.
  2. 0

    Magari provare

    spring.datasource.validation-query=SELECT 1
    spring.datasource.test-on-borrow=true

    (Vedi AbstractDataSourceConfiguration per altre opzioni.)

    • Questo ‘tipo di risolvere’ il problema, non ho problemi nella mia macchina di sviluppo, ma sul mio server (ospitato su Azure) ci vogliono 15 minuti per ottenere una risposta quando lascio la connessione inattiva. Le successive risposte sono immediate, fino a quando lascio la connessione inattiva per un periodo di tempo di nuovo. La differenza tra il mio dev macchina e il server, oltre a specifiche, è il fatto che ho cambiato il TCP keepalive impostazioni per il sistema operativo, come descritto in questa domanda. Si tenta di impostare che il server successivo.
    • Nessuna fortuna c’è, cambiato il TCPKeepAlive sul server Azure, ma hanno ancora il 15m ritardo problema dopo la connessione diventa inattivo.
    • Convalida query anche portare a un sacco di registro di spam e, generalmente, non sono l’ideale, anche se a volte non si ottiene molto alternativa.
  3. 0

    Nella stringa di connessione sono anche, come il porto o semplicemente l’endpoint? Provare a utilizzare l’intero endpoint nella stringa di connessione. Anche controllare per assicurarsi che il gruppo di protezione assegnato a RDS grado ha correttamente porte in Ingresso e in CIDR definita.

    • Aggiunto la mia stringa di connessione per la domanda cambiato il nome host). Io sono in grado di connettersi al DB utilizzando la stringa, problemi accadere solo dopo lascio la connessione inattiva per un po

Lascia un commento