一個基本成熟的數據庫連接池(part 1) – JAVA編程語言程序開發技術文章

最近,本人著手開發要有一個有強大後臺的網站,在使用連接池時,覺得使用服務器自帶的連接池總有些受限制。同時,為瞭加深對Java的學習和研究。寫下瞭下面的連接池類。
該連接池主要有一下功能;

1)初始化一次,到處使用。
2)強大的日志功能,記錄每一個sql動作,包括Connection、ResultSet 和Statement
3)根據連接的數量,定時自動回收已經釋放或超時的連接。
4)配置靈活,可以使用各種JDBC驅動程序,支持多驅動程序。

更新說明:
1)新增瞭字符集配置項。
2) 新增瞭調試開關,便於使用前調試。
3)更改瞭日志日期輸出格式。
4)排除瞭createStatement l裡的一個bug (感謝rouselion的使用反饋)
5)修正瞭被封裝類的getXXX函數的潛在的問題。

源代碼:

  1. //file : *****< ConnectionManager.java >****
  2. /*
  3. *  @Title  連接池
  4. *  @Author: zxg
  5. *  @Version 2.5
  6. *  @Memo:定義數據庫連接及其數據庫連接池等
  7. */
  8. package com.dbaccess.dbpool;
  9. import java.io.*;
  10. import java.sql.*;
  11. import java.util.*;
  12. import com.mysql.jdbc.Driver;
  13. public class ConnectionManager {
  14.     static private ConnectionManager instance; // 唯一實例
  15. //    static private int clients;
  16.     static private long checkperiod=0;
  17.     private Vector drivers = new Vector();
  18.     private Hashtable pools = new Hashtable();
  19.     private Timer checkConnTimer=new Timer();
  20.     //調試模式開關
  21.     private static boolean debug=false;
  22.     
  23.     //字符集哈西表
  24.     static private Hashtable Characters= new Hashtable();
  25.     static private PrintWriter log;
  26.     /**
  27.     * 返回唯一實例.如果是第一次調用此方法,則創建實例
  28.     *
  29.     * @return ConnectionManager 唯一實例
  30.     */
  31.     static synchronized public ConnectionManager getInstance() {
  32.         if (instance == null) {
  33.             instance = new ConnectionManager();
  34.         }
  35. //        clients++;
  36.         return instance;
  37.     }
  38.     /**
  39.     * 建構函數私有以防止其它對象創建本類實例
  40.     */
  41.     private ConnectionManager() {
  42.         init();
  43.     }
  44.     /**
  45.     * 讀取屬性完成初始化
  46.     */
  47.     private void init() {
  48.         Properties    dbProps=null;
  49.         try {
  50.             InputStream    is =  getClass().getResourceAsStream(“db.properties”);
  51.             dbProps = new Properties();
  52.             dbProps.load(is);
  53.         }
  54.         catch (Exception e) {
  55.             e.printStackTrace();
  56.             System.err.println(“不能讀取屬性文件= “ +
  57.             “請確保db.properties在CLASSPATH指定的路徑中”);
  58.             return;

You May Also Like