Wie ich bereits erwähnt habe, liegt dies daran, dass die Sockets, die geöffnet und mit der Datenbank verbunden sind, nicht erkennen, dass die Verbindung unterbrochen wurde, und daher verbunden blieben, bis das Socket-Timeout des Betriebssystems ausgelöst wird, was meiner Meinung nach normalerweise in etwa 30 Minuten liegen könnte .
Um das Problem zu lösen, müssen Sie das Socket-Timeout in Ihrer JDBC-Verbindungszeichenfolge oder in der JDNI-Verbindungskonfiguration/Eigenschaften überschreiben, um das socketTimeout zu definieren param auf eine kleinere Zeit.
Denken Sie daran, dass jede Verbindung, die länger als der definierte Wert ist, beendet wird, selbst wenn sie verwendet wird (ich konnte dies nicht bestätigen, habe ich gelesen).
Die anderen beiden Parameter, die ich in meinem Kommentar erwähne, sind connectTimeout und autoReconnect .
Hier ist meine JDBC-Verbindungszeichenfolge:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
Ich habe auch den DNS-Cache von Java deaktiviert, indem ich
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
Ich tue dies, weil Java die TTLs nicht berücksichtigt, und wenn das Failover stattfindet, ist der DNS derselbe, aber die IP ändert sich.
Da Sie einen Anwendungsserver verwenden, müssen die Parameter zum Deaktivieren des DNS-Cache an die JVM übergeben werden, wenn der Glassfish mit -Dnet gestartet wird, und nicht die Anwendung selbst.