首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

数据库连接池学习札记

2012-08-21 
数据库连接池学习笔记连接池源代码请参看前一篇博文??连接池管理类中的属性:private?int?clients?//?????

数据库连接池学习笔记

连接池源代码请参看前一篇博文

?

?

连接池管理类中的属性:

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-->

热点排行