Zoals ik al eerder opmerkte, is het omdat de sockets die open zijn en verbonden zijn met de database zich niet realiseren dat de verbinding is verbroken, dus bleven ze verbonden totdat de time-out van de OS-socket werd geactiveerd, wat volgens mij meestal in ongeveer 30 minuten kan zijn .
Om het probleem op te lossen, moet u de sockettime-out in uw JDBC Connection String of in de JDNI CONnection Configuration/Properties overschrijven om de socketTimeout te definiëren param naar een kleinere tijd.
Houd er rekening mee dat elke verbinding die langer is dan de gedefinieerde waarde, wordt verbroken, zelfs als deze wordt gebruikt (ik heb dit niet kunnen bevestigen, lees ik).
De andere twee parameters die ik in mijn opmerking noem zijn connectTimeout en autoReconnect .
Dit is mijn JDBC-verbindingsreeks:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
Ik heb ook Java's DNS-cache uitgeschakeld door te doen
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
Ik doe dit omdat Java de TTL's niet respecteert, en wanneer de failover plaatsvindt, is de DNS hetzelfde, maar het IP-adres verandert.
Aangezien u een toepassingsserver gebruikt, moeten de parameters om de DNS-cache uit te schakelen, worden doorgegeven aan de JVM bij het starten van de glassfish met -Dnet en niet aan de toepassing zelf.