# JDBC3PoolingDataSource - Bestehende Verbindung verwenden



## miketech (15. Okt 2006)

Hi,

ich sitze gerade an einer kleinen Webanwendung mit JSP + Servlets und wollte nun eine Verbindung zu meiner PostgreSQL Datenbank mit JDBC herstellen. Nun ist es ja so, dass ich im Normalfall jedes mal, wenn eine Seite aufgebaut wird eine neue Verbindung herstellen müsste. Application Server verwalten ja die Verbindungen für mich und halte bereits verwendete Verbindungen im Speicher, damit diese bei Bedarf wiederverwendet werden können.

Nun habe ich ja keinen Application Server. Da bin ich nun auf Jdbc3PoolingDataSource aufmerksam geworden. Ist das im Grunde dasselbe?


Mein Problem ist nun folgendes:

```
Jdbc3PoolingDataSource source = new Jdbc3PoolingDataSource();
		source.setDataSourceName("Testverbindung");
		source.setServerName("myhost");
		source.setDatabaseName("mydb");
		source.setUser("myuser");
		source.setPassword("mypw");
		source.setMaxConnections(10);


....
                Connection con = source.getConnection() ;
```

Damit erhalte ich eine Verbindung. Das funktioniert beim ersten mal auf problemlos. Beim zweiten Seitenaufruf wird bemängelt, dass schon eine Verbindung mit obigem Namen existiert. Das ist ja auch gut so. Nur wie verwende ich die nun? 

Um genau zu sein lautet die Fehlermeldung:
java.lang.IllegalArgumentException: DataSource with name 'Testverbindung' already exists!


Einfach setDataSourceName ausführen, schauen ob es eine Exception wirft und diese abfangen? Und dann einfach das Object "source" wie oben verwenden? Oder muss ich noch irgendwas machen? 

Woher weiß Jdbc3PoolingDataSource denn dann, welche Verbindung ich möchte? Denn eigentlich ist der DataSourceName ja der eindeutige Bezeichner, oder? Dann müsste ich doch mit diesem irgendwie schauen können, ob schon eine Verbindung existiert.

Hat jemand einen Tipp?

Gruß

Mike


----------



## miketech (21. Okt 2006)

Hi nochmal,

ich habe noch ein paar Code Zeilen im Internet gefunden, die Jdbc3PoolingDataSource verwenden. Allerdings speichern diese die Connection einfach als lokale Variable. Ist das denn der Sinn des Ganzen? Ich dachte ich möchte die Connection vom Pool erhalten und nicht lokal speichern. 

Oder versteh ich irgendwas falsch?

Gruß

Mike


----------



## bronks (21. Okt 2006)

Da ich mitbekommen habe, daß Du Tomcat verwendest, würde ich vorschlagen, daß Du den Tomcat-DBCP dafür hernimmst.


----------



## robertpic71 (22. Okt 2006)

miketech hat gesagt.:
			
		

> Hi nochmal,
> 
> ich habe noch ein paar Code Zeilen im Internet gefunden, die Jdbc3PoolingDataSource verwenden. Allerdings speichern diese die Connection einfach als lokale Variable. Ist das denn der Sinn des Ganzen? Ich dachte ich möchte die Connection vom Pool erhalten und nicht lokal speichern.
> 
> Oder versteh ich irgendwas falsch?



Nachdem dir Bronks schon das richtige Stichwort gegeben hat, hier noch etwas Erklärung zu den Pools:

Der Ablauf ist wiefolgt:

- Connectionpool einrichten (1x)

bei jeder Benutzung:
- Connection holen (in deinem Fall von source - Jdbc3PoolingDataSource)
- Connection verwenden (in einer lokale Connection)
- Connection closen (!)

Das Close ist in diesem Fall eher ein zurückgeben der Connection an den Pool. In der Regel bleibt die Connection offen (je nach Min- und Maxwerten).

Um bei deinem Beispiel zu bleiben: Da müsstest du dafür sorgen, dass der Pool (source) nur einmal gestartet wird und von überall zugänglich (static, singleton..) machen - damit man davon eine Connection holen kann. Es geht aber auch eleganter...

Man kann den Connectionpool via JNDI registrieren. Siehe Beispiel 31-6 der 

>> PostgreSQL Doku <<. Es geht aber noch eleganter....

Wenn das Connectionpooling vom Web/Application-Server übernommen wird, kann man den Connectionpool auch dort konfigurieren. Die Anwendungen können dann auf den fertig gestarten Connectionpool via JNDI zugreifen (Verwendung wie in Postgres-Beispiel). Wenn du für Tomcat das Administratormodul nachinstallierst, kannst du das Registrieren dort menügesteuert erledigen.

Robert


----------

