DB-Verbindung beenden beim auflauf der session?

Status
Nicht offen für weitere Antworten.

Samson_Miller

Bekanntes Mitglied
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?
 
M

maki

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

Lieber trennen, MVC und so...
 

Samson_Miller

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

maki

Gast
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

Top Contributor
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:
Code:
<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:
Code:
<?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:
Code:
		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

Bekanntes Mitglied
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

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

Guest

Gast
> 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.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben