Thread Connectionpool?!

ElJarno

Mitglied
Hi Leute,
es geht darum dass ich mir ne Klasse mit ein paar Static Methoden erstellen wollte. Diese soll mir für meine Datenbanken Verbindungen erstellen und auch offen halten wenn ich sie zurückgebe. Falls eine bestimmte Anzahl an offen Verbindungen vorliegt, sollen diese nach einem bestimmte Zeitintervall geschlossen und gelöscht werden. Bisher hab ich es so:
Code:
public class ConnectionPool {
	// Zeit bis der der Reducethread wartet und dann Verbindungen schliesst;
	private static final int reducePeriod = 300000;
	private static HashMap<DBConnectionTypes, Vector<BaseConnection>> connections = new HashMap<DBConnectionFactory.DBConnectionTypes, Vector<BaseConnection>>();

	public void initConnections() {

	}

	public static BaseConnection getConnection(DBConnectionTypes dbConnectionTyp)
			throws SQLException {
		Vector<BaseConnection> vecOracleConns = connections
				.get(dbConnectionTyp);
		if (vecOracleConns != null && !vecOracleConns.isEmpty()) {
			BaseConnection connection = vecOracleConns.get(0);
			vecOracleConns.remove(connection);
			if (connection.getConnection().isClosed())
				connection.openConnection();
			return connection;
		} else {
			BaseConnection connection = DBConnectionFactory
					.getDbConnection(dbConnectionTyp);
			connection.openConnection();
			return connection;
		}
	}

	public static void putConnection(BaseConnection connection)
			throws SQLException {
		Vector<BaseConnection> vecOracleConns = connections.get(connection
				.getDbConnectionTyp());
		if (vecOracleConns != null) {
			vecOracleConns.add(connection);
			if (vecOracleConns.size() > 5)
				reduceConnections(connection.getDbConnectionTyp());
		} else {
			Vector<BaseConnection> vecConnections = new Vector<BaseConnection>();
			vecConnections.add(connection);
			connections.put(connection.getDbConnectionTyp(), vecConnections);
		}
	}

	private static void reduceConnections(
			final DBConnectionTypes dbConnectionTyp) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(reducePeriod);
					Vector<BaseConnection> vecConnections = connections
							.get(dbConnectionTyp);
					for (int i = 0; 10 < vecConnections.size(); i++) {
						vecConnections.get(0).closeConnection();
						vecConnections.remove(0);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
}

Nun hab ich aber das bekanntliche Thread-Problem, dass bei dem Thread in der reduceConnections vorkommen kann wenn ich nun die Verbindunge aus dem Vector lösche währen gleichzeitig in der get oder putConnection darauf zugegriffen werden könnte. Hatte dann überlegt den Methoden kram in symchronisierte Methoden eines Objekts zu packen und diese alle dann hier über Threads aufrufe, nur ist dann ja das Problem bei der getConnection, dass ich ja keine Objekt zurückgeben kann, bzw. ich auch nicht darauf warten kann bis der Thread das Objekt bekommen hat. Ich hoffe es ist soweit verständlich was ich vorhabe.

Gruß Jan
 
Hallo ElJarno,

willst Du den Pool in einem Projekt einsetzen oder willst Du es interessehalber lösen, bzw. weil es eine Aufgabe ist?

Im ersten Fall, nimm besser einen fertigen Pool, davon gibt es ein gutes Dutzend, z.B.
http://commons.apache.org/dbcp/

Im zweiten Fall denke ich über eine Antwort nach ;)
 
Zurück