# Servlets/JSP & JDBC & Postgres - ConnectionPool



## anp (5. Apr 2009)

Hi,

momentan bastel ich an einer Anwendung, die bei nahezu jedem Seitenaufruf Querys an die DB absendet. Nun ist ja der Aufbau der DB-Connection zeitaufwändiger als ein Query über eine bestehende Connection abzusenden, dafür gibt es wohl sogenannte ConnectionPools.

Nun habe ich zwar die entsprechenden API-Seiten darüber gelesen, habe aber noch Verständnisprobleme mit der Umsetzung.

Meine Theorie bisher: ich brauche eine Instanz eines Connection-Pools (woher? welche Klasse?), die die Zugangsdaten zur DB kennt und entsprechend eine (oder mehrere) Verbindungen zur DB aufbaut und diese hält. Diese Instanz speichere ich am besten in der application-Instanz, damit ich aus den Servlets und JSP heraus auf den Pool zugreifen kann: z.B. soll ein Servlet einen Query ausführen, dieser holt sich über die application eine virtuelle (?) Connection aus dem Pool, kann damit arbeiten und schließt sie, wobei aber letztendlich keine neue ECHT Verbindung zur DB erstellt wurde?!

Habe ich das nun korrekt verstanden?

Also noch mal meine Fragen zusammengefasst:
woher bekomme ich die Instanz des ConnectionPools? Wahrscheinlich muss ich mir eine Klasse selber basteln, aber wovon erbt diese bzw. welches Interface wird implementiert?
wo soll die Instanz des ConnectionPools gespeichert werden? application? Dann müsste man vor Benutzung bzw. nach einem Neustart der eigentlichen Applikation diese Klasse erst mal instantiieren, d.h. z.B. mit einem gesonderten Servlet "init" oder so den ConnectionPool zum rennen bringen?
wie bekommt meine Klasse diese virtuelle Verbindung?

Freue mich über eure Antworten 

VG


----------



## SlaterB (5. Apr 2009)

ob man sowas hier besprechen kann?
da bieten sich doch eher fertige Tools oder zumindest ausführliche Tutorials usw. an

hier mal schnell gefunden:
bietet ziemlich viel des von dir genannten, bis auf Verbindung zum ApplicationContext, 
hier wird sich anscheinend in den DriverManager registriert, was vielleicht recht ähnlich ist:

java connectionpool example - Google-Suche
->
Chapter 8 Continued: Connection Pooling


----------



## anp (5. Apr 2009)

ich schaue mir grade die Tutorials durch, finde diesen Beispielcode relativ verständlich, jedenfalls verständlicher als das sun-Bsp 

Das bedeutet, dass es gar keinen fertigen Pool gibt, sondern ich muss mir einen eigenen schreiben? Normalerweise muss man doch bei Java nie das Rad jedes mal neu erfinden, deshalb bin ich etwas erstaunt... oder habe ich da was übersehen?


----------



## SlaterB (5. Apr 2009)

gewiss gibts das an jeder Straßenecke für 5 Cent,

wenn ich hier schaue:
Java Forum @ javaCore.de :: Thema anzeigen - SQL-Datenbanktabelle über eine Visual Web JSF Portlet Page
dann sind das anscheinend ein paar Konfigurationen in der web.xml

Experte bin ich da aber nicht


----------



## mvitz (5. Apr 2009)

Wenn du mit dem Tomcat arbeitest, kannst du es z.B. folgedermaßen machen:

META-INF
|- context.xml
[HIGHLIGHT="xml"]<Context>
	<Resource name="jdbc/memBlogDB" auth="Container" type="javax.sql.DataSource"
		maxActive="100" maxIdle="30" maxWait="10000" driverClassName="org.h2.Driver"
		url="jdbc:h2:mem:memBlogDB" username="sa" password="" />
</Context>[/HIGHLIGHT]

WEB-INF
|- web.xml
[HIGHLIGHT="xml"]...
	<resource-ref>
		<res-ref-name>jdbc/memBlogDB</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>
...[/HIGHLIGHT]

Dann kann man über die Javaklassen:
[HIGHLIGHT="Java"]...
		Context ctx = new InitialContext();
		DataSource dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/memBlogDB");
		Connection con = dataSource.getConnection();
...[/HIGHLIGHT]

Und dann hierüber ganz normal die Datenbankabfragen ausführen.

Edit: code tags leicht angepasst


----------



## anp (5. Apr 2009)

@habi55: ich glaube, genau das habe ich gesucht 

bevor ich das einbaue, noch ein paar Fragen: wo kann ich weitere Informationen darüber bekommen, bzw. wie nennt man dieses "Verfahren" mit diesen xml-Dateien? Habe ehrlich gesagt keine Ahnung davon, Eclipse hat die immer brav erstellt.

Zur Anwendung: d.h. Tomcat (ja, darüber läufts) verwaltet quasi für mich die DB-Verbindungen? maxIdle scheint fast die Antwort darauf zu sein, dass die Verbindungen bei Bedarf erstellt und gehalten werden?!
In der direkten Anwendung brauche ich mir auch keine Sorgen um die Verbindung zu machen, da sie mir wie aus einem ConnectionPool heraus gegeben wird? Naja, schließen sollte ich sie im Java-Code schon, aber sie bleibt im Hintergrund (falls sie unter dem maxIdle bleibt) geöffnet?

Falls das alles so zutrifft, hab ich mindestens den ganzen Abend gute Laune 

Vielen Dank!


----------



## mvitz (5. Apr 2009)

Ich kann dir das jetzt auch nicht 100% bestätigen, aber evtl. findet sich ja hier was genaueres:

The Apache Tomcat 5.5 Servlet/JSP Container - JNDI Resources HOW-TO

Ansonsten habe ich das vorgehen aus einigen Folien eines Profs aus dem letzten Semester, mache die Vorlesung aber erst dieses und wir sind noch nicht so weit.


----------

