Mysql
 sql >> Database >  >> RDS >> Mysql

Problema relativo al pool di connessioni

Ecco il flusso degli eventi per illustrare cosa sta succedendo:

  1. Una connessione è richiesta e utilizzata dal chiamante (applicazione o pool di connessioni)
  2. Il chiamante conserva un riferimento ad esso in modo che la connessione possa essere riutilizzata
  3. Il chiamante attraversa un periodo di inattività (ad esempio, un sistema di sviluppo durante la notte o un sistema di controllo qualità durante il fine settimana).
  4. Una volta che la connessione al database non è in uso, il database considera la connessione inattiva. Poiché è inattivo, dopo un certo periodo di tempo (l'impostazione predefinita di MySQL è 8 ore) il database chiude la connessione.
  5. Il chiamante ha ancora un handle per la connessione e quando il chiamante tenta di riutilizzare la connessione scopre spiacevolmente che la connessione è stata chiusa.

Il motivo per cui autoReconnect=true funziona e che il pool che verifica la validità della connessione funziona è che stai indicando al sistema chiamante di testare la connessione per questa situazione e di riprovare se si verifica questa situazione.

Per quanto riguarda se la query di convalida influirà sulle prestazioni:in teoria utilizza una connessione per fare qualcosa. In pratica quel qualcosa è così banale che il suo effetto è trascurabile nel contesto dell'intero sistema.

[MODIFICA]

In questo caso Apache DBCP è il pool di connessioni in sospeso sulla connessione, ma NON si desidera che DBCP chiuda la connessione dopo ogni chiamata. Lo scopo del pool di connessioni è mantenere una connessione pronta per la chiamata successiva perché la creazione di connessioni è costosa. Gli oggetti connessione gestiti dal pool sono supportati da connessioni al database effettive e il database è colui che chiude tale connessione effettiva dopo il periodo di timeout di inattività. Si noti che il timeout per chiudere le connessioni inattive è configurato nel database, non nel pool di connessioni. Per questo motivo, DBCP non ha modo di sapere se la connessione è stata chiusa o meno a meno che non tenti effettivamente di connettersi con essa. Ecco perché hai bisogno di una query di convalida.

Per ulteriori informazioni sulla configurazione di DBCP, vedere la pagina di configurazione e i documenti API .