浅谈数据库连接池

1、数据库连接池技术带来的优势:
1)资源重用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
2) 更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3) 统一的连接管理,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。

2、创建连接的代码片段:

String connUrl = "jdbc:mysql://your.database.domain/yourDBname"; 
Class.forName("com.mysql.jdbc.Driver"); 
Connection con = DriverManager.getConnection (connUrl);
当我们创建了一个Connection对象,它在内部都执行了什么:
1)“DriverManager”检查并注册驱动程序,
2)“com.mysql.jdbc.Driver”就是我们注册了的驱动程序,它会在驱动程序类中调用“connect(url…)”方法。
3)com.mysql.jdbc.Driver的connect方法根据我们请求的“connUrl”,创建一个“Socket连接”,连接到IP为“your.database.domain”,默认端口3306的数据库。
4)创建的Socket连接将被用来查询我们指定的数据库,并最终让程序返回得到一个结果。

数据库连接的昂贵:每申请一个连接(Connection)会在物理网络(如 TCP/IP网络)上建立一个用于通讯的连接,在此连接上还可以申请一定数量的Statement。连接池中同一连接可提供的活跃Statement数量可以达到几百。在节约网络资源的同时,缩短了每次会话周期(物理连接的建立是个费时的操作)。

连接池初始化时创建一定数量的连接,然后从连接池中重用连接,而不是每次创建一个新的。

3、我们使用的连接池供应者,它的内部有一个连接池管理器。
1)它创建连接池的默认大小,比如指定创建5个连接对象,并把它存放在“可用”状态的任何集合或数组中。

  String connUrl = "jdbc:mysql://your.database.domain/yourDBname"; 
  String driver = "com.mysql.jdbc.Driver"; 
  private Map<java.sql.Connection, String> connectionPool = null; 
  private void initPool() { 
    try { 
      connectionPool = new HashMap<java.sql.Connection, String>(); 
      Class.forName(driver); 
      java.sql.Connection con = DriverManager.getConnection(connUrl);
      for (int poolInd = poolSize; poolInd > 0; poolInd--) { 
        connectionPool.put(con, "AVAILABLE"); 
      } 
  } 
2)当我们调用connectionProvider.getConnection(),然后它会从集合中获取一个连接,当然状态也会更改为“不可用”。
public java.sql.Connection getConnection() throws ClassNotFoundException, SQLException
  { 
      boolean isConnectionAvailable = true; 
      for (Entry<java.sql.Connection, String> entry : connectionPool.entrySet()) { 
          synchronized (entry) { 
              if (entry.getValue()=="AVAILABLE") { 
                  entry.setValue("NOTAVAILABLE"); 
                  return (java.sql.Connection) entry.getKey(); 
              } 
              isConnectionAvailable = false; 
          } 
      } 
      if (!isConnectionAvailable) { 
          Class.forName(driver); 
          java.sql.Connection con = DriverManager.getConnection(connUrl); 
          connectionPool.put(con, "NOTAVAILABLE"); 
          return con; 
      } 
      return null; 
  } 
3)当我们关闭得到的连接,ConnectionProvider是不会真正关闭连接。相反,只是将状态更改为“AVAILABLE”。
public void closeConnection(java.sql.Connection connection) throws ClassNotFoundException, SQLException { 
    for (Entry<java.sql.Connection, String> entry : connectionPool.entrySet()) { 
        synchronized (entry) { 
            if (entry.getKey().equals(connection)) { 
                //Getting Back the conncetion to Pool 
                entry.setValue("AVAILABLE"); 
            } 
        } 
    } 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值