最近,本人著手開發要有一個有強大後臺的網站,在使用連接池時,覺得使用服務器自帶的連接池總有些受限制。同時,為瞭加深對Java的學習和研究。寫下瞭下面的連接池類。
該連接池主要有一下功能;
1)初始化一次,到處使用。
2)強大的日志功能,記錄每一個sql動作,包括Connection、ResultSet 和Statement
3)根據連接的數量,定時自動回收已經釋放或超時的連接。
4)配置靈活,可以使用各種JDBC驅動程序,支持多驅動程序。
更新說明:
1)新增瞭字符集配置項。
2) 新增瞭調試開關,便於使用前調試。
3)更改瞭日志日期輸出格式。
4)排除瞭createStatement l裡的一個bug (感謝rouselion的使用反饋)
5)修正瞭被封裝類的getXXX函數的潛在的問題。
源代碼:
- //file : *****< ConnectionManager.java >****
- /*
- * @Title 連接池
- * @Author: zxg
- * @Version 2.5
- * @Memo:定義數據庫連接及其數據庫連接池等
- */
- package com.dbaccess.dbpool;
- import java.io.*;
- import java.sql.*;
- import java.util.*;
- import com.mysql.jdbc.Driver;
- public class ConnectionManager {
- static private ConnectionManager instance; // 唯一實例
- // static private int clients;
- static private long checkperiod=0;
- private Vector drivers = new Vector();
- private Hashtable pools = new Hashtable();
- private Timer checkConnTimer=new Timer();
- //調試模式開關
- private static boolean debug=false;
- //字符集哈西表
- static private Hashtable Characters= new Hashtable();
- static private PrintWriter log;
- /**
- * 返回唯一實例.如果是第一次調用此方法,則創建實例
- *
- * @return ConnectionManager 唯一實例
- */
- static synchronized public ConnectionManager getInstance() {
- if (instance == null) {
- instance = new ConnectionManager();
- }
- // clients++;
- return instance;
- }
- /**
- * 建構函數私有以防止其它對象創建本類實例
- */
- private ConnectionManager() {
- init();
- }
- /**
- * 讀取屬性完成初始化
- */
- private void init() {
- Properties dbProps=null;
- try {
- InputStream is = getClass().getResourceAsStream(“db.properties”);
- dbProps = new Properties();
- dbProps.load(is);
- }
- catch (Exception e) {
- e.printStackTrace();
- System.err.println(“不能讀取屬性文件= “ +
- “請確保db.properties在CLASSPATH指定的路徑中”);
- return;