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.