以前にコメントしたように、開いていてデータベースに接続されているソケットは、接続が失われたことに気付かないため、OSソケットのタイムアウトがトリガーされるまで接続されたままでした。 。
この問題を解決するには、JDBC接続文字列またはJDNI接続構成/プロパティのソケットタイムアウトをオーバーライドして、 socketTimeoutを定義する必要があります。 paramをより短い時間に。
定義された値より長い接続は、使用されている場合でも強制終了されることに注意してください(これを確認できていませんが、私が読んだものです)。
コメントで言及している他の2つのパラメーターは、 connectTimeout です。 およびautoReconnect 。
これが私のJDBC接続文字列です:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
また、JavaのDNSキャッシュを無効にしました
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
これを行うのは、JavaがTTLを尊重せず、フェイルオーバーが発生すると、DNSは同じですが、IPが変更されるためです。
アプリケーションサーバーを使用しているため、アプリケーション自体ではなく、-Dnetを使用してGlassfishを起動するときに、DNSキャッシュを無効にするパラメータをJVMに渡す必要があります。