Хотя у меня нет ответа, я могу сказать вам, почему такие вещи случаются
Это в основном происходит с любым протоколом выше TCP, который не отправляет периодические импульсы.
TCP не позволяет обнаружить, что удаленный конец закрыт, без отправки каких-либо данных, и даже в этом случае может потребоваться значительное время для обнаружения отказа удаленного конца.
В идеальном случае сервер отправляет пакет TCP FIN, когда он выходит из строя, но этого не происходит, если кто-то выдергивает сетевой кабель, сервер сильно падает или промежуточный межсетевой экран / межсетевой экран NAT молча прерывает соединение. Это приводит к тому, что клиент не знает, что сервер ушел, и вам придется что-то отправить и предположить, что сервер ушел, вы не получили ответ в течение разумного времени или произошла ошибка (как правило, первые несколько отправляют () вызов после тихого отключения сервера не выдаст ошибку).
Итак, если вы хотите убедиться, что соединение с БД в порядке, выполните запрос select 1
; `. Некоторые низкоуровневые API БД могут иметь метод ping () / isAlive () или similer, который можно использовать для той же цели.