Java - Allgemein

Connection Pooling

Der folgende Source wurde mal eben schnell eingehackt und ist daher ungetestet, sollte aber trotzdem funktionieren ;-)


package com.sowas.lib.sql;
 
import java.sql.*;
import java.util.*;
 
public class ConnectionPool {
	Vector vPool = new Vector();
	String strDriver, strURLDatabase;
 
	//....................
 
	public ConnectionPool(String strDriver, String strURLDatabase){
		this.strDriver=strDriver;
		this.strURLDatabase=strURLDatabase;
	}
 
	//....................
 
	public Connection getConnection(){
		PoolConnection poolCon;
		for (int c=0; c < vPool.size(); c++)
			if (((PoolConnection)vPool.elementAt(c)).fInUse == false){
				poolCon = (PoolConnection)vPool.elementAt(c);
				poolCon.fInUse=true; 
				return poolCon.con;
			}
 
		Connection con;
		try{
			Class.forName(strDriver);
			con = DriverManager.getConnection(strURLDatabase);
		}catch (Exception e){
			e.printStackTrace();
			return null;
		}
 
		poolCon = new PoolConnection(con, true);
		vPool.addElement(poolCon);
		return con;
	}
 
	//....................
 
	public void closeConnection(Connection con){
		try {
			int c=0;
			while (!((PoolConnection)vPool.elementAt(c)).con.equals(con))
				c++;
			((PoolConnection)vPool.elementAt(c)).fInUse=false;
		} catch (Exception e) {
			e.printStackTrace();
		}	
	}
	//....................
 
}
 
class PoolConnection{
	Connection  con;
	boolean		fInUse;
 
	public PoolConnection(Connection con, boolean fInUse){
		this.con=con;
		this.fInUse=fInUse;
	}
}

Die Verwendung der Klasse könnte so aussehen:

ConnectionPool cp = new ConnectionPool("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/datenbank");
Connection con = cp.getConnection();
Statement stat = con.createStement();
//...
stat.close();
cp.closeConnection(con);

Natürlich kann noch einiges verbesert werden.
Insbesondere sind keine Timeouts berücksichtigt.
Beim Verwenden von Connection Pooling sollten Timeouts aber ohnehin abgeschaltet werden.