基本原理
数据库连接池的基本原理是,事先建立一定量的数据库连接,这些连接存放在连接池中,当java应用程序执行一个数据库事物时,只需要从连接池中取出空闲的数据库连接。
当java应用执行完后,再将数据库连接放回连接池。
连接池需要考虑以下的问题
- 限制连接池中最多、可以容纳的连接数目,避免过度消耗系统资源。
- 当客户请求连接,而连接池中所有连接都已被占用时,该如何处理呢?一种方式是让客户一直等待一直等待,直到有空闲连接,另一种方式是为客户分配一个新的临时连接。
- 当客户不在使用连接,需要把连接重新放回连接池。
- 连接池中允许处于空闲状态的连接的最大项目。假定允许的最长空闲时间为十分钟,并且允许空闲状态的连接最大数目为5,
那么当连接池中有n个(n>5)连接处于空闲状态的时间超过十分钟时,就应该把n-5个连接关闭,并且从连接池中删除,这样才能更有效的利用系统资源。
线程池和数据库连接池有相似的地方,上面的这些注意点在线程池ThreadPoolExecutor类的构造方法中都有体现
连接池实现策略
- 取出连接:如果连接池缓存不为空,就从中取出一个连接并将其返回,否则新建一个连接将其返回。
连接池的getConnection()方法返回一个连接池的代理,连接代理实现了Connection接口,但它的close()方法不会断开数据库连接,而是把自身放回连接池(释放连接)。
在Invocationhandler实现类(代理对象)的invoke()方法里面加入如下关键代码
if(method.getName().euqals("close")){
pool.releaseConnection((Connection)proxy)
}
- 释放连接:如果连接池缓存未满,就把连接放回连接池缓存,否则就关闭该连接。
- 关闭连接池:如果连接池缓存中的所有连接关闭,在清空连接池缓存。