Jak jsem již uvedl dříve, je to proto, že sokety, které jsou otevřené a připojené k databázi, si neuvědomují, že spojení bylo ztraceno, takže zůstali připojeni, dokud se nespustí časový limit soketu OS, což může být obvykle asi 30 minut. .
Chcete-li problém vyřešit, musíte přepsat časový limit soketu ve vašem připojovacím řetězci JDBC nebo v konfiguraci/vlastnostech připojení JDNI a definovat socketTimeout param na kratší čas.
Mějte na paměti, že jakékoli připojení delší než definovaná hodnota bude ukončeno, i když je používáno (nemohl jsem to potvrdit, četl jsem).
Další dva parametry, které zmiňuji ve svém komentáři, jsou connectTimeout a automatické opětovné připojení .
Zde je můj připojovací řetězec JDBC:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
Také jsem deaktivoval mezipaměť DNS v Javě provedením
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
Dělám to proto, že Java nerespektuje TTL, a když dojde k převzetí služeb při selhání, DNS je stejné, ale IP se změní.
Vzhledem k tomu, že používáte aplikační server, musí být parametry pro deaktivaci mezipaměti DNS předány JVM při spouštění glassfish pomocí -Dnet a nikoli samotné aplikaci.