Aqui está o fluxo de eventos para ilustrar o que está acontecendo:
- Uma conexão é solicitada e usada pelo chamador (aplicativo ou pool de conexões)
- O chamador mantém uma referência a ele para que a conexão possa ser reutilizada
- O chamador passa por um período de inatividade (por exemplo, um sistema dev durante a noite ou um sistema de controle de qualidade no fim de semana).
- Uma vez que a conexão com o banco de dados não está em uso, o banco de dados considera a conexão inativa. Por estar ocioso, após um certo período de tempo (o padrão do MySQL é 8 horas), o banco de dados fecha a conexão.
- O chamador ainda tem um identificador para a conexão e, quando o chamador tenta usar a conexão novamente, descobre desagradavelmente que a conexão foi encerrada.
A razão pela qual autoReconnect=true funciona, e que o pool testando a validade da conexão funciona, é que você está instruindo o sistema chamador a testar a conexão para esta situação e tentar novamente se esta situação acontecer.
Quanto a saber se a consulta de validação afetará o desempenho:Em teoria, está usando uma conexão para fazer algo. Na prática, algo é tão trivial que seu efeito é desprezível no contexto de todo o seu sistema.
[EDITAR]
Nesse caso, o Apache DBCP é o pool de conexão que está pendurado na conexão, mas você NÃO deseja que o DBCP feche a conexão após cada chamada. O objetivo do pool de conexões é manter uma conexão pronta para a próxima chamada porque criar conexões é caro. Os objetos de conexão mantidos pelo pool são apoiados por conexões de banco de dados reais, e o banco de dados é aquele que fecha essa conexão real após o período de tempo limite ocioso. Observe que o tempo limite para fechar conexões inativas é configurado no banco de dados, não no pool de conexões. Por causa disso, o DBCP não tem como saber se a conexão foi fechada ou não, a menos que ele realmente tente se conectar a ela. É por isso que você precisa de uma consulta de validação.
Para obter mais informações sobre como configurar o DBCP, consulte a página de configuração e os documentos de API .