# Datenbankverbinung mehrfach verwenden



## Amen (23. Dez 2013)

Hallo,

ich bin dabei ein halbwegs größeres Programm zu schreiben.
Das Programm arbeitet viel mit einer Datenbank.
Die Verbindung klappt soweit.

Ich habe mir eine Klasse Datenbank geschrieben, die ich 1x in der Main-Methode meines Programmes aufrufe. Das Objekt gebe ich an die Klassen weiter, die mit der Datenbank arbeiten.

Die Datenbank-Klasse sieht so aus: 

```
public class Datenbank {

    public Datenbank() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        datenbankVerbinden();
    }

    public Connection connection;


    private void datenbankVerbinden() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        String treiber = "org.apache.derby.jdbc.EmbeddedDriver";
        Class.forName(treiber).newInstance();

        String datenbankLink = "...";
        connection = DriverManager.getConnection(datenbankLink, ..., ...);
    }


    public synchronized ResultSet datenbankAktionMitResultSet(String abfrage, ResultSet resultSet) throws SQLException {
        try (Statement statement = connection.createStatement()) {
            resultSet = statement.executeQuery(abfrage);
        }
        return resultSet;
    }

    public synchronized void datenbankAktionOhneResultSet(String abfrage) throws SQLException {
        try (Statement statement = connection.createStatement()) {
            statement.executeUpdate(abfrage);
        }
    }

}
```

Wenn jetzt irgendeine Klasse meines Programms mit der Datenbank arbeiten will, bekommt diese Klasse das datenbank-Objekt, dass ich 1x in der main-methode erstellt habe und ruft mit dem Objekt dann die beiden Methoden datenbankAktionMitResultSet bzw. datenbankAktionOhneResultSet auf.

Wenn ich datenbankAktionMitResultSet aufrufe, erstelle ich zuerst ein Resultset-Objekt und lasse es mit der Methode dann auffüllen und wieder zurückgeben... (hoffentlich sowei verständlich  )

- Ist es sinnvoll die beiden Methoden synchronized zu setzen?...um zu verhindern, dass die Methode zur gleichen Zeit mehrmals aufgerufen wird?
- Machen die beiden Methoden bzw. die Klasse Datenbank Sinn?
- Wie wird das bei wirklichen großen Programmen gemacht? ^^


----------



## stg (23. Dez 2013)

Wenn ich dich richtig verstehe, dann arbeitest du also überall immer mit der gleichen Datenbankverbindung. Das ist nicht schön. Du solltest für jeden Aufruf eine neue Verbindung bereitsstellen und diese anschließend wieder schließen. Gib deinem Datenbankinterface/Klasse also eine Methode 
	
	
	
	





```
public getConnection()
```
 Mehr muss solch eine Klasse eigentlich gar nicht nach außen bekannt geben.

Da das öffnen (und anschließende schließen) von Datenbankverbindungen allerdings relativ langsam ist, greift man in der Praxis meistens auf ConnectionPooling zurück. Hierbei werden eine bestimmte Anzahl offener Verbindungen zur Datenbank bereitgestellt und die Verbindungen nur auf logischer Ebene nach außen hin geöfnnet und geschlossen. (In Wahrheit werden sie einfach aus dem Pool der zur Verfügung stehenden Verbindungen entfernt und wieder hinzugefügt).
Mit Derby hab ich selbst nie gearbeitet, aber dieses Vorgehen sollte von allen gängigen JDBC-Treiber unterstützt werden. Mit den genannten Schlagwörtern solltest du dazu definitiv eine Menge im Netz finden. Bei konkreteren Fragen, frag aber gerne noch mal nach.


----------



## Amen (23. Dez 2013)

Vielen Dank 

Vorallem für das Stichwort ConnectionPooling :idea:


----------

