数据库连接池学习笔记
连接池源代码请参看前一篇博文
?
?
连接池管理类中的属性:
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-->