在ODBC/JDBC中,创建一个数据库连接往往会花费好几秒的时间,这是因为DBMS需要完成用户认证,权限校验以及用户临时空间分配等操作,很多DBMS会为每个新的数据库连接创建一个新的进程。
如果每次SQL操作都创建一个新的连接,这从效率上来说无疑是难以忍受的。数据库连接池就是通过缓存和重用数据库连接的方法解决这个问题。
本文实现的JDBC数据库连接池,参考了[C.Austin,M.Pawlan, Advanced Programming for the Java 2 Platform,Addison Wesley Longman,Inc, 2000]中的方法,修改了该方法在连接状态检测的bug,并且在此基础上实现了一个支持4种DBMS(MySQL、PostgreSQL,Oracle和SQL Sever)的连接池管理器,尤其提供了与数据库无关的二进制大对象(BLOB)的操作方法。
相关的Java类有4个:ZConnection,ZConnectionPool,SQLTools和ZConnectionPoolManager。
ZConnection是一个实现了JDBC3.0中定义的Connection接口以及一些和连接池相关的方法的Java类,它包括一个对应真正连接的私有成员,与Connection接口相关的操作除了close外是由该成员完成的。close方法并非真正关闭,而是将之回收到ZConnectionPool的stack中,以便重新利用。使用连接池创建出来的Connection和使用以前一般的Connection在对外接口上没有差别。其类结构如下:
public class ZConnection implements Connection {
public ZConnection(Connection conn, ZConnectionPool pool) throws SQLException
protected void setInUse(boolean use)
protected boolean isInUse()
public boolean validate(String validateSql) throws SQLException
private final void assertInUse() throws SQLException
public Statement createStatement() throws SQLException
/*
*此处略去java.sql.Connection接口中定义的若干方法
*/
public void close() throws SQLException
private Connection conn;
private ZConnectionPool pool;
private Statement validateStmt;
private boolean inUse;
private boolean autoCommit;
}
ZConnectionPool包含一个stack用来缓存ZConnection对象,如果stack满了,那么请求回到stack的ZConnection将会被真正关闭。考虑到多线程的安全性,returnConnection和getConnection是线程同步(synchronized)的方法。ZConnectionPool的类结构如下所示:
public class ZConnectionPool {
protected ZConnectionPool(String url, String user, String password, int poolSize, String pingSql)
protected synchronized void returnConnection(ZConnection conn) throws SQLException
public synchronized ZConnection getConnection() throws SQLException
public void closeAll()
public synchronized void increateSize(int det)
private String url;
private String user;
private String password;
private final long timeout = 60000;
private int poolSize;
private Stack conns;
private String pingSql;
}
SQLTools是为了方便处理不同数据库中BLOB的处理而设计的,目前它支持4种DBMS(MySQL、PostgreSQL,Oracle和SQL Sever)的BLOB操作。使用SQLTools能帮助用户从处理不同DBMS的BLOB的细节中解脱出来。
public class SqlTools {
public static byte[] getBlob(ResultSet rs, int i, String dbtype) throws SQLException
public static Object setBlob(PreparedStatement pstmt, int i, String dbtype, byte[] bts) throws SQLException
public static void releaseTmp(Object obj) throws SQLException
}
ZConnectionPoolManager为了能够同时管理不同DBMS的连接池而设计的。它同时也简化了连接池的创建。目前它支持4种DBMS(MySQL、PostgreSQL,Oracle和SQL Sever)。
public class ZConnectionPoolManager {
public static String DBTYPE_MYSQL = "mysql";
public static String DBTYPE_SQLSERVER = "sqlserver";
public static String DBTYPE_ORACLE = "oracle";
public static String DBTYPE_POSTGRESQL = "postgresql";
public ZConnectionPoolManager()
public String createConnectionPool(String type, String host, String db, String user, String password, int maxPooled ) throws ClassNotFoundException
public String createConnectionPool(String type, String host, int port,String db, String user, String password, int maxPooled ) throws ClassNotFoundException
public ZConnectionPool getConnectionPool(String key)
public void removeConnectionPool(String key)
public void removeAll()
public String getDBRelatedParam(String type, String param)
private static boolean inited = false;
private static HashMap dbRelatedParamTable = new HashMap();
private static HashMap connectionPoolMap = new HashMap();
}




