日期:2014-05-16  浏览次数:20526 次

Java程序为什么需要数据库连接池

?

引言

java应用开发中经常有程序员讲需要配置数据库连接池,如果不配置连接池,应用在大量用户访问的情况下会发生数据库连接异常,也就是会说连不上数据库,然后如数家珍的列举一大堆连接池组件,比如:dbcp、c2p0、bonecp。。。。,各个都系出名门,都号称具有什么什么优势,更有好事者自己开发一个连接池。那为什么要引入连接池呢?换句话说引入连接池会带来什么好处呢?下面就让我们来分析一下,探测一下谜底。


解密


数据库连接的原理

数据库连接的本底上都是tcp连接,tcp连接位于osi的4层上,所有的数据库驱动都在7层上实现自己的协议。数据库连接的协议一般都是二进制的协议。应用程序和数据库每建一个数据库其实就是在底层建立了一个tcp线路,tcp线路是有底层的操作系统实现的,每个线路占用两个端口,发送端口和接收端口,这两个端口在数据交换过程中会互换角色,时而发送、时而接收。当web应用连接mysql数据库时,目标的接收端口是3306,连接时3306要被明确的指定,此时web应用方也有一个端口被占用,这个端口不需要被明确的指定,是操作系统自动分配的。操作系统的端口数是有限的,一般缺省可能是1024,不同的操作系统会有所不同,每一个socket也是占用资源的,一般叫socket的资源描述符,这些资源对于操作系统来说也是有限的,linux下通过ulimit命令可以指定更多资源。


连接无法打开原因

  1. 占用端口不释放,每一个socket在调用close后,socket会处于Time_wait状态,处于此状态的socket需要经过一段时间才能释放,这个释放时间随不同的操作系统而不同,socket的不释放导致端口不释放,再次连接时操作系统分配不出端口
  2. socket文件描述符不释放,还是上面的原因,socket资源不释放,操作系统不能分配新的资源


建立连接的资源开销

java的数据库连接相对来说是重量级的,构建一个连接的系统开销很大,不停的关闭、创建数据库连接对应用系统来说开销太大


连接池的应用

连接池是存储、管理数据库连接的容器,应用程序把获取数据库连接的功能委托给连接池,每个连接池都有一个上限,如果连接池达到上限,应用程序线程申请连接时被堵塞,等待其他线程释放连接,每个线程使用完连接后并不马上关闭,至少把它返还给连接池。由于连接的共享,不会频繁的创建、销毁连接,因此就不会增加创建连接的开销,也不会出现socket释放延迟现象。


其他

  1. jndi连接池是整个web容器持有,容器内所有的应用共享,有可能造成应用之间的竞争
  2. 应用级的连接池,粒度较小,容易控制