数据库连接池设计思路

基本原理

数据库连接池的基本原理是,事先建立一定量的数据库连接,这些连接存放在连接池中,当java应用程序执行一个数据库事物时,只需要从连接池中取出空闲的数据库连接。

当java应用执行完后,再将数据库连接放回连接池。

连接池需要考虑以下的问题

  1. 限制连接池中最多、可以容纳的连接数目,避免过度消耗系统资源。
  2. 当客户请求连接,而连接池中所有连接都已被占用时,该如何处理呢?一种方式是让客户一直等待一直等待,直到有空闲连接,另一种方式是为客户分配一个新的临时连接。
  3. 当客户不在使用连接,需要把连接重新放回连接池。
  4. 连接池中允许处于空闲状态的连接的最大项目。假定允许的最长空闲时间为十分钟,并且允许空闲状态的连接最大数目为5,

那么当连接池中有n个(n>5)连接处于空闲状态的时间超过十分钟时,就应该把n-5个连接关闭,并且从连接池中删除,这样才能更有效的利用系统资源。

线程池和数据库连接池有相似的地方,上面的这些注意点在线程池ThreadPoolExecutor类的构造方法中都有体现

连接池实现策略

  • 取出连接:如果连接池缓存不为空,就从中取出一个连接并将其返回,否则新建一个连接将其返回。

  连接池的getConnection()方法返回一个连接池的代理,连接代理实现了Connection接口,但它的close()方法不会断开数据库连接,而是把自身放回连接池(释放连接)。

  在Invocationhandler实现类(代理对象)的invoke()方法里面加入如下关键代码

  if(method.getName().euqals("close")){

    pool.releaseConnection((Connection)proxy)

  }

  • 释放连接:如果连接池缓存未满,就把连接放回连接池缓存,否则就关闭该连接。
  • 关闭连接池:如果连接池缓存中的所有连接关闭,在清空连接池缓存。
posted @ 2018-10-09 21:45  palapala  阅读(2820)  评论(0编辑  收藏  举报