Jag har haft sådana här problem förut när databasen är på en separat box och det finns en brandvägg däremellan som är inställd på timeout för lediga anslutningar.
I vissa fall avbryter brandväggen anslutningen på ett sådant sätt att JDBC-änden inte upptäcker, och ett försök att använda det resulterar i ett obestämt block.
I mitt fall var det en anpassad anslutningspool som skickade en testfråga ner i anslutningen innan den returnerades från poolen. Jag konfigurerade den här testfrågan att ha en timeout (med Statement.setQueryTimeout) så att den inte blockerades på obestämd tid.