Oracle JDBC connection timed out Problem
Ich habe ein Szenario in der Produktion für eine web-app, wo, wenn ein Formular übermittelt wird, werden die Daten gespeichert, die in 3 Tabellen in einer Oracle-DB über JDBC. Manchmal bin ich zu sehen, Verbindungs-time-out-Fehler in den logs, während die app versucht, eine Verbindung zu Oracle DB durch Java-code. Dies ist intermittierend.
Unten ist die Ausnahme:
SQL exception while storing data in table
java.sql.SQLRecoverableException: IO Error: Connection timed out
Meisten der Zeit die web-app ist in der Lage, um die Verbindung zur Datenbank und einfügen von Werten in es aber einige Male, und ich bin immer diese time-out-Fehler und nicht zum einfügen von Daten in es. Ich bin nicht sicher, warum bin ich immer diese intermittierende Problem. Wenn ich überprüfte die verbindungen, pool config meiner Anwendung habe ich bemerkt, das folgende Dinge:
-
Pool-Größe (Maximale Anzahl der Verbindungen, wird dieser pool öffnen können) :
10
-
Pool warten (Maximale Wartezeit in Millisekunden, bevor eine Ausnahme auslösen, wenn alle zusammengefasste Verbindungen sind in Verwendung) :
1000
Da die Größe des Pools ist nur 10 und, wenn mehrere Benutzer versuchen, eine Verbindung zu Datenbank wird diese Verbindung time-out-Problem auftreten ?
Auch da gibt es 3 Tische, an denen das einfügen von Daten tritt auf, machen wir das ganze einführen in nur einer Verbindung selbst. Wir sind nicht opneing jedem DB-Verbindung für jede einzelne Tabelle.
HINWEIS: Diese Anwendung wird bereitgestellt auf AEM (Content Management system) - server und-verbindungen-pool config ist von Ihnen zur Verfügung.
Update: ich habe versucht, die Validierung der Abfrage in den verbindungen pool, aber ich bin noch immer das Verbindung time-out Fehler. Ich bin nicht sicher, ob die verbindungen den pool geprüft hat, Validierung, Abfrage oder nicht. Ich habe befestigt die pool-verbindungen, die oben für Referenz.
- Konnte Sie zeigen, wie der pool konfiguriert? Wie Sie die config-Datei oder der Benutzeroberfläche, nur um zu sehen, welche Optionen verfügbar sind?
- Eine Sekunde ist nicht eine sehr lange Zeit zu warten, wenn Sie die Durchführung komplexer Operationen mit mehreren Benutzern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde versuchen, zwei Dinge:
Versuchen Sie, eine Validierung, Abfrage, so dass jedes mal, wenn der pool mietet eine Verbindung, die Sie sicher sind, dass es tatsächlich verfügbar ist.
select 1 from dual
funktionieren sollte. Auf den letzten JDBC-Treiber, die sollten nicht erforderlich sein, aber Sie könnte es gehen.Schätzung der Parallelität der form. 10 verbindungen-pool ist nicht zu klein, abhängig von der Komplexität Ihrer Arbeit auf die DB. Es scheint, Sie speichern ein Formular so sollte es nicht sein, DASS komplexe. Wie viele Benutzer pro Tag erwarten Sie? Dann, auf dem Höhepunkt der Zeit, wie viele Nutzer Sie erwarten, zu sein mit dem Formular zur gleichen Zeit? 10 verbindungen-pool oft vermietet und ruft verbindungen ziemlich schnell, so dass es verarbeiten kann mehrere Transaktionen pro Sekunde. Wenn Sie mehr erwarten, erhöhen Sie die Größe leicht (mehr als 25-30 tatsächlich degradiert DB Leistung mehr Abfragen für Ressourcen konkurrieren dort).
Wenn nichts zu funktionieren scheint, wäre es gut zu prüfen, was auf Ihrer DB. Wenn möglich, verwenden Sie Enterprise Manager, um zu sehen, ob es gibt Riegel, während Sie Dinge tun, auf diese drei Tabellen.
Können Sie Java-Executor-service in diesem Fall .Ein thread, Eine Verbindung , die alle asynchron .Sobald die Transaktion abgeschlossen ist , lassen Sie die Verbindung zurück an den pool.Auf diese Weise können Sie loszuwerden, diese timeout-Problem.
Wenn eine Verbindung ist das einfügen der Daten in 3 Tabellen und anderen threads versucht, um Verbindung warten, timeout ist vorprogrammiert.
Gebe ich diese Antwort vom Standpunkt der Programmierung. Es gibt mehrere Möglichkeiten für dieses problem. Dies sind die folgenden, und ich habe Hinzugefügt geeignete Lösung für Sie. Als Verbindung timeout Auftritt, bedeutet, dass Ihre neue thread nicht Datenbank-Zugriff innerhalb der genannten Zeit, und es ist aufgrund:
Möglichkeit I: Nicht die Verbindung zu schließen, sollte es die Verbindung Leckage irgendwo in der Anwendung Lösung
Sie müssen sicherstellen, dass dieses Ding und müssen prüfen, ob diese Auslaufen und schließen Sie die Verbindung nach dem Gebrauch.
Möglichkeit II: Großen Transaktion-Lösung
ich. Ist diese insertion synchronisiert, wenn es so ist, dann verwenden Sie es sehr vorsichtig. Verwenden Sie es, auf block-level-nicht-Methode Ebene. Und Ihre synchronisierten block-Größe sollte minimum so viel wie möglich.
Was passieren wird, wenn wir in großer synchronized-block, wir geben Verbindung, aber es wird in warte-Zustand, wie diese synchronisiert block braucht zu viel Zeit für die Ausführung. also anderen thread die Wartezeit erhöht. Nehmen wir an, wir haben 100 Benutzer, jeweils 100 threads für die Bedienung. 1. ist die Ausführung und es dauert zu lange. und die anderen warten. So kann es einen Fall, wo 80-90,etc-thread werfen timeout. Und Für einige thread dieses Problem Auftritt.
So, müssen Sie benötigen, um Größe zu reduzieren synchronisierten block.
Ein Beispiel für das hier, für einen Einschub eine kleine Transaktion. für die zweite anderen kleinen Transaktion, wie dieses. Und diese drei kleinen Transaktion abgeschlossen Betrieb.
Möglichkeit III: Pool-Größe ist nicht genug, wenn die usability der Anwendung ist zu hoch Lösung
Müssen erhöhen Sie die pool-Größe. (Es ist nur anwendbar, wenn Sie richtig schließt alle die Verbindung nach Verwendung)