# parallele DBConnections wie implementieren



## redbomber (18. Dez 2011)

Hi zusammen,
ich greife von meinem Java-Programm auf eine PostgreSQL Datenbank zu.

Aktuell Habe ich ein Objekt, welches alle Aktionen auf der Datenbank verwaltet. (Ich verwende die lib jdbc)
Hier eine Beispiels-Implementierung:


```
public class MyDBConnector implements Runnable{

	private Connection dBConnection; 

	public MyDBConnector{
		init();
	}
	
		@Override
	public run(){
		while(true){
			...
		}
	}
	
	private init(){
		dBConnection = DriverManager.getConnection("jdbc:postgresql://ipPublica:5432/DataBase","user", "pass");
		....
	}
	
	public query(...) throw exception{
		executeThread(new DBThread(){
			run(){
				Statement stmt = dBConnection.createStatement();
				ResultSet rs;
	 
				rs = stmt.executeQuery("SELECT Lname FROM Customers WHERE Snum = 2001");
				while ( rs.next() ) {
					String lastName = rs.getString("Lname");
					System.out.println(lastName);
				}	
			}
		}
	}
	
	public addDBEntry(){
		executeThread(new DBThread(){
			run(){
				// add a entry
				....
				}	
			}
		}
	}
	
	public removeDBEntry(){
		executeThread(new DBThread(){
			run(){
				// remove a entry
				....
			}
		}
	}
	
	private close(){
		dBConnection.close();
	}
}
```

Hier erstelle ich also ein DBConnection-Objekt welches *eine* Connection zu der Datenbank aufbaut.
Erfolgt eine Aktion auf der Datenbank, dann wird für jede Aktion ein extra Thread gestartet, welcher die Aktion (hinzufügen/entfernen/Abfrage) ausführt.

Die Synchronisation übernimmt das Connection-Object von sich aus.


-----------------------


Ok, nun habe ich gelesen dass aus Performanz-Gründen auch mehrere COnnections zur Datenbank aufgebaut werden können.

Ich möchte nun also anstatt anstatt nur eine Connection, mehrere Connections aufbauen.
Nun meine Frage, wie ich das korrekt implementieren muss.

Mein bisheriger Ansatz bzw. Idee:
Ich erstelle ein neues Objekt DBConnectionPool, welches alle Connections verwaltet.
Er initialisiert zu Beginn 1 Connection, werden weitere angefordert erstellt er noch weitere.
Eine maximale Anzahl an Connections kann festgelegt werden.

Ist mein DBConnectionPool ebenfalls ein Thread?
Was macht er wenn alle Connections "in Verwendung" sind? Welche Connection gibt er dann zurück?

Ist dieser Ansatz mit einem Extra-Objekt, welches die Connections verwwaltet überhaupt sinnvoll?


Hoffe ihr versteht meine Problematik und wisst was ich meine.
Vielen Dank schon einmal!


----------



## bERt0r (18. Dez 2011)

Schau, gibts überall schon ein tutorial dazu: Chapter 8 Continued: Connection Pooling


----------



## JanHH (18. Dez 2011)

Ist das eine Webanwendung oder eine "swing klick"-Applikation?


----------



## redbomber (18. Dez 2011)

hey vielen Dank!
Bei mir handelt es sich um eine Swing-Klick Applikation.

Der Link den du mir geschickt hast ist genau das was ich für meine Anwendung brauche.
Wie ich sehe implementiert die Klasse JDCConnectionDriver nicht runnable, ok. Dieses Objekt stellt also lediglich die Connections zur Verfügung, so wie ich es auch geplant hatte.
Was ich leider noch nicht ganz verstanden habe:
Wenn keine "freie" Connection zur Verfügung steht, dann wird in diesem Beispiel eine neue Connection initialisiert. 

Begrenze ich in meinem Fall die max. Anzahl an Connections auf x, wie genau behandle ich dann den Fall wenn alle Connections in Verwendung sind?
Normal sollte dann die Anfrage meiner Anwendung sich die Connection mit einem anderer zuvor gestellten Anfrage teilen.
Habt ihr hierfür noch eine Idee?


----------



## JanHH (19. Dez 2011)

Wieso brauchst Du denn mehrere Connections gleichzetig bei einer Desktop-Anwendung?

Und ansonsten, mal über den Einsatz von JPA nachgedacht?


----------

