WebApp (Tomcat-jdbc) Gebündelte DB-Verbindungsabbruch-Ausnahme

10

Ich habe SO schon eine Weile durchsucht und dabei meinen Hut gekaut, aber finde keine genaue Übereinstimmung mit meinem Problem.
Kurz gesagt, ich erhalte nach 60 Sekunden Inaktivität eine hervorragende Stapelverfolgung (org.apache.tomcat.jdbc.pool.ConnectionPool), was ein normales Verhalten für einige serverseitige Threads ist.
Ich verwende Tomcat JDBC Connection Pooling (org.apache.tomcat.jdbc.pool.DataSource) direkt Stack Trace:

%Vor%

Meine PoolProperties sind wie folgt konfiguriert:

%Vor%

Ich hatte gehofft setValidationInterval (30000) würde mich retten, da 30s nicht viel in einem Verbindungslebenszyklus sind. Wie auch immer, die Frage ist:
Was fehlt mir, um diese Verbindung für immer am Leben zu erhalten?
Gut zu wissen: Warum habe ich in der Funktion, die die Verbindung beansprucht, eine Zeitüberschreitung ausgeführt, obwohl sie 30 Sekunden zuvor aufgerufen wurde.

    
MonoThreaded 29.10.2012, 20:24
quelle

6 Antworten

31

Obwohl ich über ein Jahr zu spät gekommen bin, bin ich hier gestolpert, weil ich ähnliche Probleme hatte und auch eine Lösung brauche. Also dachte ich, ich würde erzählen, was letztendlich für mich funktioniert hat.

In meinem Fall, nachdem ich diesen Artikel gefunden und gelesen habe & gt; & gt; & gt; configuring-jdbc-pool-high-concurrency - ich einfach habe einen Interceptor wie diesen zu meiner Poolkonfiguration hinzugefügt;

%Vor%

Damit die Zeile (von deinem geposteten Code oben), in der du setJdbcInterceptors(...) machst, nun wie folgt aussehen sollte:

%Vor%

Erklärung - Zitat aus dem Artikel, es sagt;

  

Wir möchten sicherstellen, dass wir, wenn wir feststellen, dass die Verbindung noch verwendet wird, den Zeitüberschreitungstimer zurücksetzen, so dass die Verbindung nicht als abgebrochen betrachtet wird. Wir tun dies, indem wir einen Interzeptor einfügen.

     

Jedes Mal, wenn eine Anweisung vorbereitet oder eine Abfrage ausgeführt wird, setzt der Timer den Abbruchzeitgeber im Verbindungspool zurück. Auf diese Weise ... wird bei vielen Abfragen und Aktualisierungen kein Timeout ausgelöst.

Wenn Sie bedenken, dass Sie das Problem wahrscheinlich schon lange überwunden haben, hoffe ich immer noch, dass dies jedem hilft, der ähnliche Probleme hat, die auf diese Seite stoßen, genau wie ich.

Prost!

    
CodeBurner 15.12.2013, 22:15
quelle
2

Haben Sie die Informationen auf der Tomcat-Website zu PoolConnection gesehen? Vielleicht, was Sie brauchen, ist die Eigenschaft minEvictableIdleTimeMillis

zu betrachten

Um Ihre Frage zu beantworten, haben Sie ein Zeitlimit, weil Sie nach Leerlauf & amp; verlass alle 30 Sekunden die Verbindung (siehe TimeBetweenEvictionRunsMillis ) und da du ein vereitbares Leerlaufzeitlimit auf 30 Sekunden einstellst (siehe minEvictableIdleTimeMillis ), hast du das, was du hast. Sie haben gesagt, dass Sie diese Ausnahme im Leerlauf erhalten. Ich vermute, dass die Ausnahme ein Ergebnis des Schließens einer Verbindung im Leerlauf ist, im Gegensatz zum Abbrechen einer Verbindung. Aus meiner Sicht wird das Aufgeben einer Verbindung dazu verwendet, länger als erwartete Abfragen zu verzögern (im Gegensatz zu inaktiven Verbindungen).

Persönlich würde ich keine Verbindungen für immer am Leben haben wollen, weil sie Ressourcen unnötig verbrauchen würden (das ist eine Verbindung zur Datenbank). Ich würde mit meinen Max-Verbindungen, Räumungsläufen und Leerlaufzeiten herumspielen, um für meine eigenen Bedürfnisse zu optimieren. Ich schätze, Sie können diese Werte groß genug einstellen, um fast für immer zu bleiben! Es hängt wirklich davon ab, was du tust, aber ...

Tut mir leid, ich könnte hier nicht viel mehr helfen.

    
ramsinb 30.10.2012 07:27
quelle
1

track 'removeAbandonedTimeout' in der Konfigurationsdatei. Dies sollte eine maximal laufende Abfrage in der Anwendung sein. Sonst wird die Verbindung mitten in der Ausführung geschlossen

    
ravindra 08.10.2014 08:35
quelle
1

fügen Sie in Tomcat7 in der Datei conf / server.xml

hinzu %Vor%     
Patrikoko 01.08.2016 15:38
quelle
1

Wenn Sie Ihre Datenquelle in der context.xml von tomcat definieren, sollten Sie den ResetAbandonedTimer wie folgt hinzufügen:

%Vor%

Nach dem Setzen von ResetAbandonedTimer wurde das Problem in meiner Anwendung gelöst. Sie wurden gebeten, mir mitzuteilen, ob es eine Beziehung zwischen dem ResetAbandonedTimer Interceptor und removeAbandoned="true" removeAbandonedTimeout="60"

gibt     
rajesh chaganti 20.10.2017 04:40
quelle
0

Die Antworten auf diese Frage waren sehr hilfreich für mich.

In meinem Fall hatte ich bereits den JDBC Interceptor "ResetAbandonedTimer" konfiguriert.

Allerdings hatte ich eine Abfrage, die länger lief als das "removeAbandonedTimeout", das ich auch konfiguriert hatte. Sobald ich das "removeAbandonedTimeout" erhöht habe, ging das Problem weg.

    
buzz 16.02.2018 21:03
quelle