一、从java类来分析连接池的构架,可以了解以下几点:
1. 连接池实际上分2个部分:连接池类和连接池管理类。
2. 连接池类作用是:创建和毁灭连接池、创建连接和关闭连接、遍历查询并提供有效连接、处理无效连接。
3. 连接池管理类的作用是:初始化操作(提供创建一个连接池的操作方法、获取数据库的用户密码驱动信息提供给连接池类使用)、从连接池获取有效连接提供给用户、追踪连接操作和记录日志。
4. 可以通过连接池管理类创建一个或者多个连接池。连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例。
5. 并发问题:为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。Java语言自身提供了对并发管理的支持,使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如:public synchronized Connection getConnection()
二、分析连接池管理类:
1. 首先是初始化方法:调用以下方法,实现读取属性文件、注册驱动、连接池创建。
private void
init()
... {
dbProps.load(getClass().getResourceAsStream("db.properties")); //读取属性文件
loadDrivers(dbProps); //加载和注册所有JDBC驱动程序
createPools(dbProps); //根据指定属性创建连接池实例,props为连接池属性
}
... {
dbProps.load(getClass().getResourceAsStream("db.properties")); //读取属性文件
loadDrivers(dbProps); //加载和注册所有JDBC驱动程序
createPools(dbProps); //根据指定属性创建连接池实例,props为连接池属性
}
2. 获取数据库用户密码进行创建连接池操作。
private void
createPools (Properties props)
... {
DBConnectionPool pool = new DBConnectionPool (poolName,url,user,password,max);
pools.put (poolName,pool) ;
log ("成功创建连接池" + poolName) ;
}
... {
DBConnectionPool pool = new DBConnectionPool (poolName,url,user,password,max);
pools.put (poolName,pool) ;
log ("成功创建连接池" + poolName) ;
}
3. 注册驱动
private void
loadDrivers ( Properties props )
... {
String driverClasses = props.getProperty("drivers");
Driver driver = (Driver)Class.forName(driverClasses).newInstance();
<
... {
String driverClasses = props.getProperty("drivers");
Driver driver = (Driver)Class.forName(driverClasses).newInstance();
<