# Ist meine Datenbank-Schnittstelle threadsicher?



## GimbaR (19. Mrz 2009)

Hallo,

ich arbeite in einem Projekt an der Schnittstelle zur Datenbank. Dazu verwende ich eine Klasse _Database_, die die notwendigen Methoden (wie zB das Anlegen/Löschen/Verändern von Datensätzen) zur Verfügung stellt.

Meine Klasse wird dabei einmalig instanziiert. Ihre Methoden werden aber von unterschiedlichen Threads aufgerufen, es ist also theoretisch möglich, dass mehrere Methoden parallel ausgeführt werden.

Nun habe ich _Database_ folgendermaßen implementiert: Es gibt ein Attribut [HIGHLIGHT="Java"]private Connection conn;[/HIGHLIGHT]
das im Konstruktor instanziiert und initialisiert wird
[HIGHLIGHT="Java"]this.conn = DriverManager.getConnection(this.url, this.user, this.password);[/HIGHLIGHT]
In meinen Methoden, die parallel aufgerufen werden, arbeite ich dann mit diesem einen Connection-Objekt. 
z.B. zum Anlegen eines Datensatzes:
[HIGHLIGHT="Java"]
// Query-String generieren
String query = players.put(playerName);

try {
    // Query-Statement instanziieren
    Statement stmt = conn.createStatement();

    // Query ausführen
    if (stmt.execute(query)) {
        ResultSet rs = stmt.getResultSet();

        // Attribute laden
        // ... hier wird das ResultSet ausgelesen
    }

} catch (SQLException ex) {
    // Fehlerbehandlung
    this.handleException(ex, query);
}
[/HIGHLIGHT]
Dies mache ich in jeder Methode so. Meine Frage ist nun, ob das überhaupt so möglich ist, da ja durch den parallelen Aufruf das eine Connection-Objekt _this.conn_ dann auch parallel bearbeitet wird. Soll ich besser in jeder Methode einzeln ein Connection-Objekt instanziieren?


----------



## Ebenius (20. Mrz 2009)

Auf die Connection aus mehreren Threads zuzugreifen sollte gehen: JDBC™ Guide: Getting Started: 9 Asynchrony, Threading, and Transactions.

Ebenius


----------



## tfa (20. Mrz 2009)

Sieht gefährlich aus. Mehrere Threads gleichzeitig könnten in einer Transaction rumpfuschen. Lieber einen Connection-Pool verwenden (sowieso besser, auch bei nur einem Thread).


----------



## didjitalist (20. Mrz 2009)

ich würds nicht riskieren. sun spezifziert zwar, dass alle jdbc implementierungen thread safe sein müssen, ich hab da in der vergangenheit aber ganz andere erfahrungen machen müssen. auf der sicheren seite ist man immer, wenn genau ein thread die verbindung erzeugt und verwendet.


----------

