Както коментирах по-рано, това е, защото гнездата, които са отворени и свързани към базата данни, не осъзнават, че връзката е загубена, така че те останаха свързани, докато не се задейства времето за изчакване на сокета на ОС, което прочетох, че обикновено може да бъде за около 30 минути .
За да разрешите проблема, трябва да замените изчакването на сокета във вашия низ за връзка JDBC или в конфигурацията/свойствата на JDNI връзка, за да дефинирате socketTimeout параметър на по-малко време.
Имайте предвид, че всяка връзка, по-дълга от дефинираната стойност, ще бъде убита, дори ако се използва (не успях да потвърдя това, това, което прочетох).
Другите два параметъра, които споменавам в коментара си, са connectTimeout и автоматично повторно свързване .
Ето моя JDBC низ за връзка:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
Деактивирах също DNS кеша на Java, като направих
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
Правя това, защото Java не зачита TTL-ите и когато се осъществи отказът, DNS-ът е същият, но IP-то се променя.
Тъй като използвате сървър на приложения, параметрите за деактивиране на DNS кеша трябва да бъдат предадени на JVM при стартиране на glassfish с -Dnet, а не на самото приложение.