/ / Errore collegamento comunicazione L'ultimo pacchetto inviato al server è stato 4 ms fa - java, mysql, sockets, jdbc, percona

Errore del collegamento di comunicazione L'ultimo pacchetto inviato al server era 4 ms: java, mysql, socket, jdbc, percona

Prima di tutto, so che questa domanda è stata posta molte volte, ma per me lo scenario di riproduzione è un po 'diverso immagino (beh, potrebbe essere).

Per il controllo dello stato di mysql, eseguiamo una semplice query di selezione (seleziona 1 da doppio). Una volta che il server mysql rimane inattivo per un po '(circa 1 minuto) e proviamo il controllo dello stato, otteniamo questo problema.

Collegamento alle comunicazioni non riuscito L'ultimo pacchetto inviato al server è stato effettuato 4 ms fa

"message": "Impossibile leggere la risposta dal server. Previsto di leggere 4 byte, leggere 0 byte prima che la connessione si interrompesse inaspettatamente. ", "stack": ["com.mysql.jdbc.MysqlIO.readFully (MysqlIO.java:2431)", "com.mysql.jdbc.MysqlIO.reuseAndReadPacket (MysqlIO.java:2882)", "Com.mysql.jdbc.MysqlIO.reuseAndReadPacket (MysqlIO.java:2871)", "Com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:3414)", "Com.mysql.jdbc.MysqlIO.sendCommand (MysqlIO.java:1936)", "Com.mysql.jdbc.MysqlIO.sqlQueryDirect (MysqlIO.java:2060)", "Com.mysql.jdbc.ConnectionImpl.execSQL (ConnectionImpl.java:2536)", "Com.mysql.jdbc.ConnectionImpl.execSQL (ConnectionImpl.java:2465)", "Com.mysql.jdbc.StatementImpl.execute (StatementImpl.java:734)", "Org.apache.commons.dbcp.DelegatingStatement.execute (DelegatingStatement.java:264)",

e immediatamente se proviamo ancora una volta, otteniamo una connessione di successo e tutto funziona bene. Quindi è molto sporadico in natura.

Ho visto questo post di StackOverflow com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: errore del collegamento di comunicazione

Quindi, al di fuori di tutte queste possibilità, risponderò ad alcune di queste-

  1. L'indirizzo IP o il nome host nell'URL JDBC è errato. -NO (funziona al secondo tentativo dopo un errore di comunicazione)

  2. Il nome host nell'URL JDBC non è riconosciuto dal server DNS locale. -No (stesso motivo del passaggio 1)

  3. Numero porta mancante o errato nell'URL JDBC. -No (stesso motivo del passaggio 1)

  4. Il server DB non è attivo. -NO- (il server è attivo e in esecuzione)

  5. Il server DB non accetta connessioni TCP / IP. -No (stesso motivo del passaggio 1)

  6. Il server DB ha esaurito le connessioni. -No (ho aumentato il numero di connessioni a 1000)

  7. Qualcosa tra Java e DB sta bloccando le connessioni, ad es. un firewall o un proxy.

Sì. Configurazione proxy come segue:

retries                 3
timeout http-request    10s
timeout queue           1m
timeout connect         10s
timeout client          1m
timeout server          1m
timeout http-keep-alive 10s
timeout check           10s
maxconn                 3000

alcuni dei miei dettagli etc / my.conf sono i seguenti:

connect_timeout  = 10
wait_timeout     = 28800
bind-address = 0.0.0.0
max_connections = 1000

Per creare connessioni, sto usando l'origine dati dbcp di commons (org.apache.commons.dbcp.BasicDataSource)

BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("url");
dataSource.setUsername("username");
dataSource.setPassword("pwd");
dataSource.getConnection();

Per favore aiutatemi a scoprire cosa potrebbe andare storto .. è la configurazione proxy che causa il problema o qualcos'altro ??? L'aiuto sarà molto apprezzato.

risposte:

1 per risposta № 1
  1. L'indirizzo IP o il nome host nell'URL JDBC è errato. -NO (funziona al secondo tentativo dopo un errore di comunicazione)

No, perché sei arrivato fino a executeStatement(), il che significa che hai già una connessione e a PreparedStatement.

  1. Il nome host nell'URL JDBC non è riconosciuto dal server DNS locale. -No (stesso motivo del passaggio 1)

Corretta.

  1. Numero porta mancante o errato nell'URL JDBC. -No (stesso motivo del passaggio 1)

Corretta.

  1. Il server DB non è attivo. -NO- (il server è attivo e in esecuzione)

No per lo stesso motivo di (1), (2), (3).

  1. Il server DB non accetta connessioni TCP / IP. -No (stesso motivo del passaggio 1)

Corretta.

  1. Il server DB ha esaurito le connessioni. -No (ho aumentato il numero di connessioni a 1000)

No per lo stesso motivo di (1), (2), (3), (4), (5).

  1. Qualcosa tra Java e DB sta bloccando le connessioni, ad es. un firewall o un proxy.

No, per lo stesso motivo di (1), (2), (3), (4), (5), (6).

Si è verificato un errore di comunicazione dopo stabilire una connessione. Ciò esclude tutto ciò che hai menzionato qui. Ciò che resta sono (a) condizioni transitorie sul server o nella rete, (b) idiosincrasie del pool di connessioni sul client, (c) un comando catastroficamente errato inviato dal JDBC autista, ecc. Molto probabilmente (a).