Miałem już takie problemy, gdy baza danych znajduje się na osobnym urządzeniu, a pomiędzy nimi jest zapora sieciowa, która jest ustawiona na limit czasu bezczynnych połączeń.
W niektórych przypadkach zapora odcina połączenie w taki sposób, że koniec JDBC nie jest wykrywany, a próba jego użycia skutkuje nieskończoną blokadą.
W moim przypadku była to niestandardowa pula połączeń, która wysłała zapytanie testowe w dół połączenia przed zwróceniem go z puli. Skonfigurowałem to zapytanie testowe tak, aby miało limit czasu (używając Statement.setQueryTimeout), aby nie blokowało się w nieskończoność.