Som jeg kommenterede før, er det fordi de sockets, der er åbne og forbundet til databasen, ikke er klar over, at forbindelsen er gået tabt, så de forblev forbundet, indtil OS socket timeout udløses, hvilket jeg læste, normalt kan være om cirka 30 minutter .
For at løse problemet skal du tilsidesætte socket Timeout i din JDBC Connection String eller i JDNI Connection Configuration/Properties for at definere socketTimeout param til en mindre tid.
Husk, at enhver forbindelse, der er længere end den definerede værdi, vil blive dræbt, selvom den bliver brugt (jeg har ikke været i stand til at bekræfte dette, er hvad jeg læste).
De to andre parametre, jeg nævner i min kommentar, er connectTimeout og autoReconnect .
Her er min JDBC-forbindelsesstreng:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
Jeg deaktiverede også Javas DNS-cache ved at gøre
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
Jeg gør dette, fordi Java ikke respekterer TTL'erne, og når failoveren finder sted, er DNS'en den samme, men IP'en ændres.
Da du bruger en applikationsserver, skal parametrene for at deaktivere DNS-cache overføres til JVM'en, når glassfish startes med -Dnet og ikke selve applikationen.