Ecco il flusso degli eventi per illustrare cosa sta succedendo:
- Una connessione è richiesta e utilizzata dal chiamante (applicazione o pool di connessioni)
- Il chiamante conserva un riferimento ad esso in modo che la connessione possa essere riutilizzata
- 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).
- 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.
- 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 .