连接池源代码请参看前一篇博文
连接池管理类中的属性:
private int clients; //
private Vector drivers = new Vector();
private PrintWriter log;
private Hashtable pools = new Hashtable();
内部类DBConnectionPool的属性:
private int checkedOut; // 当前连接数
private Vector freeConnections = new Vector(); // 保存所有可用连接
private int maxConn; // 此连接池允许建立的最大连接数
private String name; // 连接池名字
private String password; // 密码或null
private String URL; // 数据库的JDBC URL
private String user; // 数据库账号或null
新建数据库连接池管理类:
调用static synchronized public DBConnectionManager getInstance()获取管理类的实例, 有就直接返回,没有创建一个。保证只有一个实例,通过client记录共有几个用户
没有创建管理类时调用private DBConnectionManager(),它调用Init()读取配置文件,调用loadDrivers(dbProps)注册和记录驱动程序。调用createPools(dbProps);循环获取url和用户名密码,并新建DBConnectionPool加入到pools中,这里可以在配置文件中多配置几个连接池,这里就会创建几个连接池,连接池的创建只在新建连接池管理类(即第一次获取管理类)的时候由调用init创建
获取连接:
通过管理类实例调用Connection getConnection(String name, long time) 获取名为name连接池pool,并调用连接池pool的getConnection(String name, long time) 方法获取数据库连接。time变量可选,为时间限制,当没有time变量时,getConnection会取freeConnections中的空闲连接,若没有且没有到达最大的连接数,就会创建一个新连接返回,否则返回null。当有time时会调用上面的getConnection(String name)方法,若返回null,则当前线程会wait(time)时间,在这期间等待freeConnection(Connection con) 释放一个连接后将其唤醒。若超过time时间,则返回null。
释放连接:
通过管理类实例调用freeConnection(String name, Connection con)获取名为name连接池pool,并调用连接池pool的freeConnection(Connection con), freeConnections.addElement(con);将con连接放进空闲连接链中,并checkedOut--;notifyAll();唤醒等待队列中的线程。
释放连接池管理类:
通过管理类实例调用 public synchronized void release() ,判断--clients是否为空,若不为空直接return,否则循环获取所有pool,并调用pool的 release() 方法循环释放调pool中的所有连接(con.close();),释放完所有pool后再循环调用DriverManager.deregisterDriver(driver); 释放掉所有注册driver。
<!--EndFragment-->