# Verbindung überprüfen und bei Bedarf neu aufbauen



## miketech (25. Okt 2007)

Hi zusammen,

ich habe ein Klasse, die für die Verbindung zur Datenbank zuständig ist. Dafür habe ich eine Methode "getConnection()", welche mir immer ein intaktes Connection-Objekt liefern soll. Die Methode sieht folgendermaßen aus:

connection ist die lokale Variable.


```
public Connection getConnection() {
		try {
			// If connection is not valid
			if (connection == null || !connection.isValid(5)) {
				System.out.println("Es wird eine neue Verbindung zur Datenbank erstellt");

				// Create new connection
				connection = DriverManager.getConnection(connectionUrl, username, password);
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			connection = null;
		}
		
		return connection;
	}
```



Wenn ich nun viele SQL-Abfragen habe, fliegt mir irgendwas um die Ohren.

Exception in thread "Thread-4" java.lang.RuntimeException: java.lang.NullPointerException
	at com.mysql.jdbc.JDBC4Connection$1$1.run(JDBC4Connection.java:106)
Caused by: java.lang.NullPointerException
	at com.mysql.jdbc.ConnectionImpl.abortInternal(ConnectionImpl.java:1240)
	at com.mysql.jdbc.JDBC4Connection$1$1.run(JDBC4Connection.java:104)
Exception in thread "Thread-5" java.lang.RuntimeException: java.lang.NullPointerException
	at com.mysql.jdbc.JDBC4Connection$1$1.run(JDBC4Connection.java:106)
Caused by: java.lang.NullPointerException
	at com.mysql.jdbc.ConnectionImpl.abortInternal(ConnectionImpl.java:1240)
	at com.mysql.jdbc.JDBC4Connection$1$1.run(JDBC4Connection.java:104)

Es werden bei mir immer mehr Threads angelegt, aber ich finde den Fehler nicht. Ist die Überprüfung denn überhaupt in Ordnung, um eine korrekte Verbindung zu erhalten? Oder gibt es hier eine Alternative?

Gruß

Mike


----------



## maki (26. Okt 2007)

Die Methode scheint nicht Threadsicher zu sein.



> Oder gibt es hier eine Alternative?


Mittlerweile gibt es doch genug JDBC Connectionpooling frameworks, wie zB. Apache DBCP.

http://commons.apache.org/dbcp/


----------



## miketech (26. Okt 2007)

Hi,

das ist super, danke. Ich habs auch schon eingebaut, hab aber noch ein Problem. Ich gehe wie gesagt folgendermaßen vor:

Ich habe eine Klasse, die sich nur um die Datenbankverbindungen kümmert. 

database.getConnection() liefert die Connection.

Hier habe ich nun die aus DBCP eingebaute BasicDataSource verwendet:

Bei der Initialisierung:


```
dataSource = new BasicDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		dataSource.setUrl(connectionUrl);
```

Und immer, wenn database.getConnection() aufgerufen wird:

return dataSource.getConnection();

Das Problem ist, dass getConnection() jedes mal eine neue Verbindung herstellt. Ich wollte aber ja nur eine Verbindung, die eben bei Bedarf aufgebaut wird. Oder muss ich die Verbindung jedes mal nach Verwendung schließen? 

Gibt es auch eine Möglichkeit, dass ich einfach eine aktive Verbindung bekomme? getConnection() sollte mir eine aktive geben und wenn schon eine existiert nicht noch eine erstellen.

Hat jemand eine Idee?

Gruß

Mike


----------



## maki (26. Okt 2007)

> Das Problem ist, dass getConnection() jedes mal eine neue Verbindung herstellt. Ich wollte aber ja nur eine Verbindung, die eben bei Bedarf aufgebaut wird. Oder muss ich die Verbindung jedes mal nach Verwendung schließen?


Ja, unbedingt!

Dadurch gibst du die Connection dem Pool zurück und sie kann wieder verwendet werden.

Was gibt datasource.getInitialSize(), datasource.getMaxActive() und datasource.getMaxIdle() zurück?


----------

