金色坐标

关注互联网应用和搜索引擎技术

« 硕士研究生开题报告PPT模板JAVA初学者问题解答 »

数据库连接池实现

在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();
}




原创文章,如转载请注明:转载自金色坐标 [ http://www.kingxy.com/ ]

本文链接地址:http://www.kingxy.com/archives/151.html
  • 相关文章:
  • LDAP目录数据存取协议介绍  (2009-4-29 15:36:18)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 通过Google订阅本站
  • 通过bloglines订阅本站
  • 通过抓虾订阅本站
  • 通过yahoo订阅本站

Search

Google

最新评论及回复

最近发表

金色坐标博客——京ICP备09009094号

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.
KingXY Blog - This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.