DBCP: Verbindungen schließen: ja oder nein?

Status
Nicht offen für weitere Antworten.
Hallo,

in einem aktuellen Projekt verwende ich eine "nackte" Apache DBCP / JDBC-Implementierung ohne einen Applikationsserver.
Für mich geht aus der DBCP-Dokumentation an keiner Stelle hervor, ob sich das Framework auch selbständig um den Abbau von Datenbankverbindungen kümmert oder ob dies in meiner Verantwortung liegt. Es gibt einige Methode, mit denen man Limits für die Anzahl von "idle connections" festlegen kann, ebenso wie eine initiale Größe des Pools.
Aber nirgendwo wird wirklich beschrieben, ob ich mich tatsächlich um die Verbindungsabbau kümmern muss oder nicht. Die Art der Dokumentation liebe ich an vielen Apache-Projekten...

Könnt ihr mir mit Euren Erfahrungen hierbei weiterhelfen?

Ich kann mir vorstellen, dass es reichlich imperformant ist, nach jedem SQL-(Prepared)Statement die Verbindung abzubauen und danach wieder zu öffnen. Das ist ja nicht Sinn der Sache. Andererseits ist es sonst kaum möglich zu kontrollieren, wann Verbindungen wieder abzubauen sind. Das soll ja eigentlich auch DBCP für mich lösen (hoffe ich).

Geschätzt werden ca. 250-500 parallele Verbindungen zum Datenbankserver erwartet.

Vielen Dank!
 

Niki

Top Contributor
Wenn du eine Connection aus dem Pool holst (über den DataSource...) bekommst du einen Proxy zurück. Wenn du auf diesem Proxy dann close aufrufst, wird die Connection wieder in den Pool zurück gelegt. (Ich hoffe das stimmt so)
 
M

maki

Gast
250-500 Parallele Verbindungen???

Klingt imho nach sehr viel....

Nebenbei, wie sollte man sich als Client um Verbindungsabbau kümmern können, dass macht doch der Pool, dafür ist er ja da.
IMHO werden die meisten Verbindungen durch einen Timeout "abgebaut"...
 
@maki - ja, bis 500 Verbindungen, das ist ein mittelgroßes Projekt... deswegen ja unbedingt DBCP.

Ist Dein letzter Satz eine Vermutung? Ich fänd's schön etwas handfestere Angaben zu kriegen. Grundsätzlich bin ich ja auch der Meinungen, dass DBCP sich um das Pooling und damit um den Verbindungsabbau kümmert -- aber beschrieben wird das auf der Apache-Projektseite (mal wieder) nicht.
 

Niki

Top Contributor
Das Abbauen der Verbindungen macht auf alle Fälle der Pool, die Frage ist nur wann. Entweder wie maki sagte durch Timeouts, oder wenn die Applikation geschlossen wird (eventuell über Shutdown-Hook)
Du musst dich nur darum kümmern dass die Verbindungen wieder in den Pool zurück gelegt werden (Connection#close)

//EDIT
Weil du meintest 500 Verbindungen. Das sind aber nicht die Anzahl der verbundenen Clients, oder? Du brauchst nicht für jeden Client eine eigene Verbindung. Sobald eine Transaktion gestartet wird sollte eine Verbindung aus dem Pool geholt werden, dann wird die Transaktion gestartet, mit commit/rollback beendet und die Verbindung in den Pool zurück gelegt. Die Transaktionen/Connections sollten eben nur so kurz wie möglich gehalten werden
 
M

maki

Gast
Vermutung?
Klar, aber wie sollten sie sonst geschlossen werden?
Ich sehe keinen Sinn darin, einen Pool zu verwenden, wenn ich die Verbindungen selbst schliessen muss.

In meinen mittelgroßen Projekten hatte ich max. 30 Verbindungen, aber dass muss ja nichts heissen.
Darf man fragen wie du auf diese Zahl kommst?
Bei so vielen Verbindungen würde ich nicht notwendigerweise DBCP verwenden, gibt auch andere CPs.

Auf der anderen Seite arbeite ich immer mit einem ConnectionPool sobald ich JDBC nutzen muss (was gott sei dank selten geworden ist).
Mit Frameworks wie iBatis oder gar ORM wie Hibernate ist ein Pool auch ein muss, leicht zu konfigurieren über die Frameworks.
 
Niki - danke für die Infos!
TimeOuts wären für mich OK. Shutdown-Hooks kann ich hier leider nicht implementieren.
Was ich nun noch nicht ganz verstanden habe, ist Dein Satz danach:
Du musst dich nur darum kümmern dass die Verbindungen wieder in den Pool zurück gelegt werden (Connection#close) ---> Das wäre dann in dem Fall eines Shutdown-Hooks zu machen, habe ich das richtig verstanden?

Zum Verständnis: Für mich ist es dasselbe, die Verbindung zu schließen oder sie in den Pool zurückzugeben. Wichtig wäre demnach dann (bitte nochmal konkret sagen) zu wissen, ob tatsächlich so etwas wie

preparedStatement.execute();
connection.close();

in meinem Code auftreten muss. Dass die Verbindung danach vom DBCP ins Pool gelegt wird ist mir klar. Nicht aber, ob ich selbst die Verbindung explizit schließen muss.



Zu den 500 Verbindungen: Es handelt es sich um 500 Clients, das ist richtig. Ich bin davon ausgegangen, dass sie gleichzeitig auf dem System arbeiten und daher jeder tatsächlich eine eigene Connection benötigt. Es können auch 250 Clients sein, die parallel zugreifen. Aber der Richtwert liegt im Hunderterbereich. :)
 

Niki

Top Contributor
Es ist nicht das selbe ob du die Connection zurück legst oder abbaust. Du musst nachdem Absetzten des Statements connection.close aufrufen, das close schließt aber in diesem Fall die Verbindung nicht, sondern legt sie in den Pool zurück. Du solltest dich auch nicht um den Abbau der Verbindungen kümmern, das macht alles der Pool. Nur eben wann ist die Frage. Entweder bei Timeouts, oder beim Beenden der Applikation. Das hat dich aber eigentlich gar nicht zu kümmern. Für dich ist nur wichtig dass du die Verbindung mittels close zurück gibst.
Für 500 gleichzeitige Benutzer reichern wahrscheinlich 50 - 100 Verbindungen allemal, da ja nicht jeder Benutzer gleichzeitig eine Transaktion starten wird. Normalerweise kann ma einen Pool auch so konfigurieren dass er neue Connections erzeugt, sobald er sie benötigt oder die Threads müssen warten, bis eine Connection wieder frei gegeben wird.
 
M

maki

Gast
Ich würde so maximal 30-50 Verbindungen verwenden.

1 User = 1 Verbindung ist schlecht gerechnet, und kostet mehr als es bringt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T apaches dbcp und threads Datenbankprogrammierung 2
tfa Apache DBCP: Reconnect nach Timeout? Datenbankprogrammierung 3
Zrebna Lediglich interne DB-Verbindungen (Connections) auslesen - mittels Java Datenbankprogrammierung 4
D Richtiger Umgang mit Verbindungen in JPA Datenbankprogrammierung 39
F MariaDatabase Einstellungen für Verbindungen Datenbankprogrammierung 5
R MySQL Frage zum Anlegen von Artikeln inkl. Verbindungen Datenbankprogrammierung 0
O Viele Verbindungen-Exception bei insert Daten zur MySQL-Datenbank Datenbankprogrammierung 2
R Connection Pooling - Tote Verbindungen Datenbankprogrammierung 5
C Programm baut zu viele MySQL Verbindungen auf Datenbankprogrammierung 4
M Max Verbindungen aus einer Applikation zu MySQL Datenbankprogrammierung 2
P Reicht finally nicht um DB connections zu schließen in (altem) Java? Datenbankprogrammierung 4
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
Z Beim schließen des Programms die verbindung zur DB beenden. Datenbankprogrammierung 4
M H2 Verbindung zur Datenbank komplett schließen Datenbankprogrammierung 11
D Resultset schließen ?? Datenbankprogrammierung 5
H EclipseLink: Schließen der Datenbank Datenbankprogrammierung 0
m²labs Muss ich wirklich bei jeder Anfrage öffnen/schließen? Datenbankprogrammierung 3
A Datenbank schließen Datenbankprogrammierung 8
E MySQL SQL - wann connection schließen Datenbankprogrammierung 2
Helgon H2 Verbindung öffnen/schließen - Dauer, wann, wie lange? Datenbankprogrammierung 2
X Connection schließen oder speichern? Performance Frage Datenbankprogrammierung 7
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
F statements und resultsets schließen Datenbankprogrammierung 2
T ResultSet schließen? Datenbankprogrammierung 6
Z Jedesmal die Datenbank öffnen und schließen ? Datenbankprogrammierung 9
K db connection wann schließen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben