Ich erhalte Pool-Fehler Timeout wartet auf ein leeres Objekt

8
%Vor%

Ich habe den Verbindungspool mit der obigen Anweisung im Tomcat-Server erstellt.

Einige Android-App verbindet sich mit meiner Anwendung mit Web-Service.Über den Web-Service sende und empfange ich einige Daten. Ich erhalte den Fehler

%Vor%

Ich habe Verbindungspoolausnahme gesehen : Verbindung nicht möglich, Poolfehler Timeout wartet auf leeres Objekt .

Aber keine Ahnung für mich.

Was sind die Gründe dafür?

Vielen Dank im Voraus ...

    
PSR 05.12.2013, 13:26
quelle

1 Antwort

23

Diese Ausnahme besagt, dass der Pool-Manager keine brauchbare Verbindung zu einem wartenden Requester herstellen kann und dass der maxWait abgelaufen ist, wodurch ein Timeout ausgelöst wird. Es gibt mehrere mögliche Ursachen, aber sie fallen normalerweise in zwei Kategorien:

  1. Die Datenbank ist inaktiv oder nicht erreichbar. Das könnte daran liegen, dass Sie vergessen haben, es zu starten, oder es ist abgestürzt oder das Netzwerk zwischen Ihnen und der DB funktioniert nicht mehr. Aber im Grunde konnte der Pool keine gültige neue Verbindung bereitstellen und so hat der Anforderer auf eine neue Verbindung länger als die Zeitüberschreitung gewartet und hat aufgegeben. Dies ist normalerweise der unwahrscheinliche Fall, weil Sie normalerweise andere Fehler sehen, wenn dies passiert.

  2. Der Verbindungspool (der auf 100 max active gesetzt ist) hat keine Verbindungen mehr. Dies kann an einem hohen Anforderungsvolumen liegen oder an einem Verbindungsleck, bei dem die Verbindungen nie an den Pool zurückgegeben werden und das Limit für maximale Verbindungen überschritten wird. Dies ist die wahrscheinliche Ursache ... normalerweise ein Verbindungsverlust, weil Datenbankressourcen nicht geschlossen werden, wenn Sie damit fertig sind.

Manchmal 1 und 2, um dieses Szenario zu erstellen, wenn die Datenbank beispielsweise einen Fehler entdeckt, bei dem Abfragen nicht mehr ausgeführt werden. Wenn das passiert, ist es wie ein Verbindungsleck, weil neue Verbindungen ausgehen und bei einer Abfrage gegen die DB blockieren und niemals freigegeben werden. Schließlich sind alle Verbindungen aktiv und der nächste Thread, der eine Verbindung anfordert, wird in die Warteschlange gestellt, da keine weiteren Verbindungen mehr vorhanden sind. Da die DB abgesprungen ist, werden Sie bis zum ersten Requester, der sich in der Warteschlange befindet, keine weiteren Ausnahmen sehen. Wir haben dies gelegentlich mit Oracle UCP gesehen, als das Oracle DB-Backend abgestürzt ist.

Ich würde empfehlen, JConsole zu verwenden, um die DB-Poolgrößen zu überwachen, wenn dies geschieht, und zu bestimmen, welche der zwei oben genannten Kategorien von Ursachen für diesen Fehler ausgelöst wird. Und dann können Sie versuchen, die Verbindung zu reparieren oder die Poolgröße / Timeout-Parameter zu manipulieren, um den tatsächlichen Bedarf zu decken (Sie können auch die Connector-Parameter in Tomcat ändern, um den Gesamtbedarf der Anwendung zu reduzieren). Wenn Sie in Tomcat arbeiten, können Sie JConsole (das sich im JDK-Verzeichnis bin) normalerweise einfach ausführen und an den Tomcat-Prozess anhängen und dann einfach durch die JMX-Konsole schauen, wo die Poolgröße gefunden wird ... normalerweise hängt vom Datenquellentyp ab (dbcp vs oracle ucp vs etc). Dann können Sie auf die Feldwerte doppelklicken, um sie zu plotten, so dass Sie sie im Laufe der Zeit verfolgen können.

Außerdem müssen Sie möglicherweise JMX in Tomcat aktivieren, damit JConsole JMX-Überwachung funktioniert.

    
reblace 05.12.2013 15:04
quelle

Tags und Links