jsp-develop.de presents:

Datenbankverbindungen verwalten (Connection Pools)

von shark,  18.05.2001 14:38:28

Bevor auf eine Datenbank zugegriffen werden kann muss eine Applikation eine DB Verbindung (Connection) zu der Datenbank herstellen. Die DB Verbindung ist der Kommunikationskanal zwischen der Applikation und der Datenbank.
Eine Datenbankverbindung ist ausserdem mit einem Datenbankbenutzer (DB Account) verknüpft.

In einer Standalone Anwendung wird eine Datenbank Verbindung einmal erzeugt und während dem Lebenszyklus der Anwendung offen gehalten. In einer Server Applikation, die mit vielen Request von verschiedenen Benutzern arbeitet, ist das Verwalten der DB Verbindungen komplexer als bei Standalone Anwendungen.

Es kostet Zeit DB Verbindungen zu erzeugen (1-3 Sekunden pro neuer Verbindung), DB Verbindungen müssen aufgrund des Transkationsverhaltens eindeutig zu einem Benutzer sein und DB Verbindungen sollten nicht über einen langen Zeitraum hinweg von einzelnen Benutzern blockiert werden.

Ein Weg um DB Verbindungen zu verwalten ist, eine Verbindung pro Servlet/JSP zu benutzen. Eine DB Verbindung kann beim initialisieren erzeugt und in einer Instanzvariablen gehalten werden. Bei diesem Ansatz ist allerdings zu beachten, dass Multithreading Probleme auftreten können, weil die DB Verbindung in einer Instanzvariablen gehalten wird.

Eine weitere Alternative ist das Konzept "one Connection per resource", das bedeutet DB Verbindungen in Session Variablen zu verwalten. Der Vorteil dabei ist, dass keine Multithreading Probleme auftreten, die DB Verbindung allerdings die meiste Zeit inaktiv ist.

Die beste Alternative ist die Verwendung eines Connection Pools. Ein Connection Pool enthält eine definierte Anzahl von DB Verbindungen (Connection Objects) die von Servlets und JSP- Seiten verwendet werden können. Für jeden Request wird eine Connection ausgecheckt, benutzt und wieder eingecheckt. Mit dem Pool Konzept erreicht man eine optimale Ausnutzung der Connection Resourcen.

Im JDBC 2.0 Standard gibt es bereits einen Connection Pool in Form von Java Klassen/Interfaces. Informationen zu dem JDBC 2.0 Connection Pool findet man in der JDBC  2.0 Spezifikation, die über den Link: http://java.sun.com/products/jdbc/ heruntergeladen werden kann.

Der Vorteil des JDBC 2.0 Connection Pools ist, dass die Benutzung des Pools transparent für den Anwendungsentwickler ist. Das DataSource Objekt, welches die Grundlage für die Ermittlung einer DB Verbindung ist, wird als JNDI Resource registriert. Der folgende Code Auszug zeigt wie man die Referenz eines DataSource Objektes ermittelt:

// Namens Kontext erzeugen
Context oContext = new InitialContext();

// Data Source Objekt erzeugen
DataSource oDataSource = (DataSource) oContext.lookup("jdbc/userDB");

// Connection Objekt aus dem Pool auschecken
Connection oConnection = oContext.getConnection();

// Connection Objekt in Pool einchecken
oConnection.close();

Auf Basis von JDBC 1.0 gibt es mittlerweile auch Implementierungen für Connection Pools. Eine gute Alternative zu dem JDBC 2.0 Connection Pool ist der "DBConnectionBroker" der über den Link: http://www.javaexchange.com heruntergeladen werden kann. Es ist empfehlenswert Wrapper zu schreiben, die den JDBC 1.0 Connection Pool die Schnittstelle des JDBC 2.0 Connection Pools übertragen. Es ist dadurch später leicht möglich einen JDBC 1.0 Connection Pool gegen eine neuere Implementierung auszutauschen.
URL dieses Beitrags:
http://www.jsp-develop.de/forumbeitrag/view/62/