Som jag kommenterade tidigare beror det på att uttagen som är öppna och anslutna till databasen inte inser att anslutningen har förlorats, så de förblev anslutna tills OS-socket timeout utlöses, vilket jag läser vanligtvis kan vara inom cirka 30 minuter .
För att lösa problemet måste du åsidosätta socket Timeout i din JDBC Connection String eller i JDNI Connection Configuration/Properties för att definiera socketTimeout param till en mindre tid.
Tänk på att alla anslutningar som är längre än det definierade värdet kommer att dödas, även om den används (jag har inte kunnat bekräfta detta, är vad jag läste).
De andra två parametrarna jag nämner i min kommentar är connectTimeout och autoReconnect .
Här är min JDBC-anslutningssträng:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
Jag inaktiverade också Javas DNS-cache genom att göra
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
Jag gör detta för att Java inte respekterar TTL:erna, och när failover äger rum är DNS densamma men IP:n ändras.
Eftersom du använder en applikationsserver måste parametrarna för att inaktivera DNS-cache skickas till JVM när du startar glassfishen med -Dnet och inte själva applikationen.