Seperti yang saya komentari sebelumnya, itu karena soket yang terbuka dan terhubung ke database tidak menyadari bahwa koneksi telah terputus, jadi mereka tetap terhubung sampai batas waktu soket OS dipicu, yang saya baca mungkin biasanya sekitar 30 menit .
Untuk mengatasi masalah ini, Anda perlu mengganti Timeout soket di String Koneksi JDBC Anda atau di Konfigurasi/Properti Koneksi JDNI untuk menentukan socketTimeout parameter ke waktu yang lebih kecil.
Ingatlah bahwa koneksi apa pun yang lebih panjang dari nilai yang ditentukan akan dimatikan, meskipun sedang digunakan (saya belum dapat mengonfirmasi hal ini, itulah yang saya baca).
Dua parameter lainnya yang saya sebutkan dalam komentar saya adalah connectTimeout dan koneksi ulang otomatis .
Inilah String Koneksi JDBC saya:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
Saya juga menonaktifkan cache DNS Java dengan melakukan
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
Saya melakukan ini karena Java tidak menghormati TTL, dan ketika failover terjadi, DNSnya sama tetapi IP-nya berubah.
Karena Anda menggunakan Server Aplikasi, parameter untuk menonaktifkan cache DNS harus diteruskan ke JVM saat memulai glassfish dengan -Dnet dan bukan aplikasi itu sendiri.