Grundlegendes Problem beim Verbindungs-Pooling von Tomcat

9

Ich verwende Tomcat 7 Verbindungspooling (als Tomcat-Ressource in server.xml und context.xml) in einer Webanwendung und es funktioniert.
Meine Frage ist: Ist es möglich Tomcat zu "sagen" / "zu zwingen", den Verbindungspool nach der Erstellung zu entsorgen?

Der Grund, den ich frage, ist folgender:
Ich benutze H2 und laufe beim Herunterfahren in ein "Renn" -Problem.
H2 bleibt geöffnet, solange eine Verbindung offen ist, aber Tomcat den Verbindungspool nicht freigibt und so Verbindungen offen bleiben. Und als Folge habe ich verschiedene Probleme beim Herunterfahren.

Ich habe festgestellt, dass ich einen SQL SHUTDOWN-Befehl ausgeben könnte, um H2 zu schließen, aber ich möchte alle Alternativen für meinen Fall untersuchen.

Ist es also möglich Tomcat zu "sagen" / "zu zwingen", den Verbindungspool zu entfernen (zumindest beim Herunterfahren)?

    
Jim 03.04.2012, 06:22
quelle

5 Antworten

1

Ich denke, Sie können versuchen, debug anmelden und überprüfen, ob das Problem mit der Verbindung nicht von der Anwendung oder etwas anderes wie Datenquelle Konfigurationsparameter in server.xml freigegeben.

meistens sollte es der Fall sein, wenn die Anwendung keine Verbindung freigibt.

    
zaga250 09.04.2012 18:23
quelle
1

Wie wäre es, wenn Sie einen benutzerdefinierten ServletContextListener schreiben und dann den Pool herunterfahren, wenn der Kontext zerstört wird? Hier ist ein Artikel über ServletContextListener, der zum Erstellen von Shutdown-Hooks verwendet wird:

Shutdown-Hook für Java-Webanwendung

Die API für Context Listener scheint ziemlich einfach zu sein:

Ссылка

    
Zeki 29.11.2012 23:27
quelle
0

Siehe meine Antwort in: Kontextspezifische JNDI Parameter Problem in Tomcat 6 . Es gibt eine Menge Dinge, die Sie mit jndi ressource tun können.

%Vor%     
Mitja Gustin 23.08.2012 13:44
quelle
0

Wie in der Dokumentation Ссылка beschrieben, ist es möglich, closeMethod der Container-Datenquelle festzulegen . Ich bin mir nicht sicher, ob ich den Verbindungspool "entsorgen" soll, aber ich denke, es ist einen Versuch wert.

  

Name der Null-Argument-Methode, um eine Singleton-Ressource aufzurufen, wenn   es ist nicht mehr erforderlich. Dies soll die Bereinigung beschleunigen   Ressourcen, die andernfalls als Teil der Garbage Collection auftreten würden.   Dieses Attribut wird ignoriert, wenn das Singleton-Attribut falsch ist. Wenn nicht   Spezifiziert, kein Standard ist definiert und keine Methode wird aufgerufen.

Sie können DataSource auch programmatisch bereitstellen und starten / stoppen in ServletContextListener , Beispiel für dbcp (Entschuldigung, es ist von meinen Unit-Tests, aber leicht umzuschreiben):

%Vor%     
user1516873 12.10.2012 09:04
quelle
0

Vielleicht verstehe ich die Frage nicht. Um es noch deutlicher zu machen, wenn Tomcat (und damit JVM) heruntergefahren wird, dann sind weder Tomcat noch seine Verbindungspools noch irgendwelche seiner Daemon-Threads am Leben ... und somit wären keine Speicherreferenzen mehr vorhanden.

Wie genau sind Sie zu dem Schluss gekommen, dass eine Tomcat-Ressource einen Verweis auf einen Verbindungspool hat, nachdem Tomcat heruntergefahren wurde? Das würde man in einem Profiler nicht sehen können, und ehrlich gesagt, macht es keinen Sinn. Ist es beispielsweise möglich, dass das Betriebssystem Verbindungen kurzzeitig geöffnet hält, bevor sie zerstört werden? Haben Sie die gleichen Tests mit dem gleichen Betriebssystem, aber mit einem anderen Container, etwa Jetty? Verwenden Sie Keep-Alive oder eine Art persistenter Verbindungen?

Wenn Sie sich mit Tomcat's Management einer Ressource, die durch JNDI verfügbar gemacht wird, abfinden wollen, können Sie Ihre eigene DataSource-Implementierung erstellen, die an die H2-DataSource delegiert. Sie können dies tun, indem Sie das Attribut factory-method in Ihrer Datei server.xml (oder context.xml) verwenden

Hier ist ein funktionierendes Beispiel für github: Ссылка

Darüber hinaus würde es helfen, wenn Sie weiter erklären könnten, was Sie unter "verschiedene Probleme beim Herunterfahren" verstehen. Diese Details sind wichtig, und es ist mir nicht klar, wie Sie logisch von "verschiedenen Problemen" zu sagen, dass Tomcat "nicht den Verbindungspool verfügt". Sie könnten sich hier mit zwei völlig unterschiedlichen Problemen befassen, und Sie sollten sich die antiResourceLocking und antiJARLocking Einstellungen für Tomcat unter Windows ansehen.

    
Volt0 10.03.2013 11:33
quelle