Connection Pooling
Den folgenden Source habe ich mal eben schnell eingehackt und ist daher ungetestet, sollte aber trotzdem funktionieren ;-)
Falls nicht -> Beschwerden bitte an mich
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.