Wir haben ein Problem mit zu vielen Oracle-Prozessen (über 2.000), wenn Verbindungen auf 1.100 begrenzt sind (mit C3P0)
Zwei Fragen:
Welche Beziehung besteht zwischen einem Oracle-Prozess und einer JDBC-Verbindung? Wird für jede Sitzung ein Oracle-Prozess erstellt? Wird für jede JDBC Anweisung eine erstellt? Keine Beziehung überhaupt?
Haben Sie sich jemals mit diesem Szenario konfrontiert, in dem Sie mehr Prozesse als JDBC-Verbindungen erstellen?
Jeder Kommentar würde wirklich geschätzt werden.
Es gibt eine Sitzung pro Verbindung. Das klingt, als hätten Sie ein Verbindungsleck, irgendwo, wo Sie eine neue Verbindung öffnen und nicht richtig schließen. Eine Möglichkeit besteht darin, dass Sie eine Verbindung innerhalb eines try
-Blocks öffnen, verwenden und schließen und eine Ausnahme in einem catch
behandeln oder aus einem anderen Grund vorzeitig zurückkehren. Wenn dies der Fall ist, müssen Sie sicherstellen, dass die Verbindung geschlossen ist in finally
oder es kann nicht passieren, dass die Verbindung (und somit die Sitzung) hängen bleibt. Das Öffnen von zwei Verbindungen in demselben Bereich ohne einen expliziten Abschluss dazwischen kann dies auch tun.
Ich kenne C3PO nicht, weiß also nicht, wie Verbindungen gehandhabt werden und wo und wie Ihr 1100-Limit festgelegt wird. Wenn es (oder Sie) einen Verbindungspool hat und die 1100, auf die Sie verweisen, die maximale Poolgröße ist, dann klingt das nicht wie das Problem, da Sie die Pool-Obergrenze vor der Sitzungsbegrenzung erreichen würden.
Sie können in v$session
suchen, um zu bestätigen, dass alle Sitzungen von JDBC kommen und es keine andere Verbindung gibt.
Vielleicht möchten Sie überprüfen, ob Ihr Server im dedizierten oder im gemeinsam genutzten Modus läuft (Sie möchten ihn wahrscheinlich in den gemeinsamen Modus versetzen, wenn Sie die Anzahl der aktiven Prozesse verringern möchten).
Sie können das überprüfen, indem Sie
ausführen %Vor%Weitere Informationen zur Prozessarchitektur
Gemeinsamer / Dedizierter Server-Modus