最近,本人着手开发要有一个有强大后台的网站,在使用连接池时,觉得使用服务器自带的连接池总有些受限制。同时,为了加深对Java的学习和研究。写下了下面的连接池类。
该连接池主要有一下功能;
1)初始化一次,到处使用。
2)强大的日志功能,记录每一个sql动作,包括Connection、ResultSet 和Statement
3)根据连接的数量,定时自动回收已经释放或超时的连接。
4)配置灵活,可以使用各种JDBC驱动程序,支持多驱动程序。
更新说明:
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;