# DB-Verbindung beenden beim auflauf der session?



## Samson_Miller (1. Jul 2008)

Ich habe eine Web-Anwendung, die im Tomcat 6 läuft. Über die Web-Anwendung wird eine Datenbankverbindung aufgebaut.

Im Tomcat habe ich eine "session-timeout" eingebaut. In der DB gibt es aber keine.

Ist es möglich, das Tomcat die DB-Verbindung automatisch beendet, wenn ein session-timeout eintritt?


----------



## maki (1. Jul 2008)

Solltest nicht jeder Session eine DB-Connection geben, kann nicht gutgehen.

Lieber trennen, MVC und so...


----------



## Samson_Miller (2. Jul 2008)

Meinst du also, es sollte nur eine Verbindung zur Datenbank geben, und jeder der sich an der Web-Anwendung anmeldet bekommt diese Verbindung?


----------



## maki (2. Jul 2008)

Nein.

Du solltest eine HTTP Session nicht an eine DB Connection binden, bzw. umgekehrt.

Für kleine Anwendungen reicht einen ConnectionPool von ca. 5- 10 Verbindungen, diese werden ja nur genutzt wenn Daten abgefragt/geändert werden und langweilen sich den Rest der Zeit (90%).

Such mal nach DAO Pattern, gab schon einige Beiträge hier im Forum, das Internet ist voll davon.


----------



## Niki (2. Jul 2008)

Nein, das ist auch keine gute Idee. Du brauchst einen Connection Pool. Den kannst du im Tomcat über die DataSources verwalten. Zum Beispiel in der Datei conf/server.xml eine shared DataSource definieren, einfach unter dem Tag *<GlobalNamingResources>* folgendes hinzufügen:

```
<Resource name="jdbc/myDatasource" auth="Container" type="javax.sql.DataSource" removeAbandoned="true" removeAbandonedTimeout="30" maxActive="100"
                maxIdle="30" maxWait="10000" driverClassName="com.ibm.db2.jcc.DB2Driver"
                url="jdbc:db2://[server]:[port]/[dbname]"
                username="[user]"
                password="[pwd]"/>
```
und dann in der webapp im META-INF Verzeichnis eine Datei context.xml anlegen:

```
<?xml version="1.0" encoding="UTF-8"?>
<Context debug="5" reloadable="true" crossContext="true">      
		<ResourceLink name="jdbc/myDatasource" global="jdbc/myDatasource" type="javax.sql.DataSource"/>             
</Context>
```
Im Code schreibst du dann:

```
Context initContext = new InitialContext();
		DataSource dataSource = (DataSource) initContext
				.lookup("java:comp/env/jdbc/myDatasource");
		Connection con = dataSource.getConnection();
```
Am besten ist du legst dir irgendwo eine statische Methode an die genau das macht und dir immer eine Connection liefert. Die Connection holst du dir nur, wenn du sie wirklich brauchst (also vor jeder Transaktion). Nach jeder Transaktion legst du die Connection in den Pool zurück: *connection.close();*

Das ist alles.


----------



## Samson_Miller (4. Jul 2008)

Viele Dank für die Antwort. 

Eine Frage hätte ich da noch. Ist es möglich Username und Password variabel zu halten? So das sich jeder Benutzer mit seinem eigenen Benutzernamen und eigenen Passwort an der Datenbank anmeldet?


----------



## Niki (4. Jul 2008)

Glaube nicht, was sollte das auch bringen? Die Datenbank hat ja eigentlich keinen user-Context sondern hängt viel eher an einer Applikation.


----------



## Guest (10. Jul 2008)

> Ist es möglich Username und Password variabel zu halten? 

Kannst Du machen  - aber dann brauchst Du für jeden User einen ConnectionPool. Dann läuft die Datenbank bei vielen gleichzeitigen Users aber schnell gegen die Wand. Es ist besser die Authorisierung in die Anwendung zu verlagern, als für jeden User einen neuen Datenbankuser anzulegen und die Datenbank die Authorisierung machen zu lassen. 

Wenn Du wissen willst, was welcher User machst, ist es besser die Datenbankzugriffe in eigener Tabelle oder LogFile mitzuloggen.


----------

