Die Anwendung-requester können nicht die Verbindung herzustellen. (Zu viele offene Dateien)
Entwickle ich Anwendungen in Websphere work manager. work manager wird verwendet, um Gewinde in der webpshere Anwendungen erver.
Alle 5 Minuten meinen thread versuchen, einige Daten aus der MySQL-Datenbank von dem anderen Rechner aus dem application-server.
Werden, wenn der Host der MySql-Datenbank deaktiviert, die Arbeit, Die manager immer versuchen, eine Verbindung zu der MySQL-Datenbank und ich weiß, dass mein Programm wird immer das bekommen, Ausnahme scheitern der Verbindung. dies ist die Ausnahme: com.mysql.jdbc.CommunicationsException:
Communications link failure due to underlying exception
Aber im Laufe der Zeit mein Programm zu erhalten, Ausnahme wie folgt:
java.sql.SQLException: The application requester cannot establish the connection. (Too many open files)
und diese Ausnahme machen, mein application server crash:
[8/2/10 9:07:21:613 ICT] 00000d54 prefs W Could not lock User prefs. Unix error code 24.
[8/2/10 9:07:21:613 ICT] 00000d54 prefs W Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
Ich brauche Anregung, wie dieses problem zu beheben und verhindern, dass mein Programm abstürzt ????
WorkEnvironment:
Operation System AIX
Application Server Webpshere 7.0
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie Sie haben einen Datei-Deskriptor-Leck.
Einige Teile des Codes (oder ein anderer code auf dem Rechner ausgeführt werden) ist die Schaffung von mehr und mehr file-handles, einschließlich sockets, und nicht diese zu schließen. Basierend auf Ihrer Beschreibung, es klingt wie es Ihre code, dies zu tun.
Ich vermute, dass beim erstellen des Sockets, Sie schließt nicht ganz sauber, wenn eine Ausnahme geworfen wird. Wenn Sie dies nicht tun, dann wird der socket bleibt geöffnet, und im Laufe der Zeit werden Sie laufen aus Dateien. Jede Ressource, die geschlossen werden muss, nach der Verwendung sollte immer geschlossen werden, in einem try-finally - - block, um sicherzustellen, dass die Ressource geschlossen werden, unabhängig von dem Weg, der durch die Methode.
Wenn Sie nicht denken, Sie sind undicht-Dateien, verwenden Sie die
lsof
- Dienstprogramm auf dem host zu sehen, was Datei-handles sind offen gehalten wird, die von Ihrem Prozess, und überprüfen Sie, dass Sie rechtmäßig müssen Sie alle von Ihnen. Ich finde es unwahrscheinlich, dass Sie einen legitimen Grund zu überschreiten, die Standard-FD Grenzen des Systems.Generell, wenn Sie die Verbindung zu einer Datenbank herzustellen, müssen Sie eine Art von open-aufrufen um die Verbindung zu öffnen, dann machst du etwas Arbeit mit der Verbindung, und schließen Sie dann die Verbindung. Wenn Sie vergessen haben, um die Verbindung zu beenden, können Sie die Ressourcen ausgehen, schnell und erhalten einen Fehler wie den, den Sie sehen. Jedoch, selbst wenn Sie es merken, um die Verbindung zu schließen, Sie könnten auf eine Ausnahme aus, während die die Arbeit machen, das würde dazu führen, Ablauf der Ausführung zu umgehen, die in der Nähe nennen. Aus diesem Grund, Sie wollen immer die Arbeit, die gewickelt werden in einem try-block, und die close-Aufruf in einem finally-block. Könnte das das problem sein?
Hatte ich vor ähnlichen problem. Ich habe es behoben durch die Erhöhung ulimit meiner user auf OS.
Dies geschieht, weil es gibt ein limit für die Anzahl offener Dateien, die in den meisten Betriebssystemen.
Auf linux-box, Sie können es durch folgenden Befehl. Hier habe ich diese unbegrenzt.
Können Sie auch prüfen, die derzeitigen Grenzen mit :
The application requester cannot establish the connection. (Too many open files)
konnte passiert werden. und warum ulimit -u die unbegrenzte Befehl ist die Lösung ? DankOutOfMemoryError
. Wenn die Anwendung legitim braucht Tausende von open-FDs, dann ist dieser Schritt wäre sinnvoll, aber das muss nachgewiesen werden zuerst durch profiling und bis zu diesem Punkt der Standard-position sein sollte, dass die Anwendung gebrochen ist.