Java程序为什么需要数据库连接池
2012-09-21 11:21
204 查看
引言
java应用开发中经常有程序员讲需要配置数据库连接池,如果不配置连接池,应用在大量用户访问的情况下会发生数据库连接异常,也就是会说连不上数据库,然后如数家珍的列举一大堆连接池组件,比如:dbcp、c2p0、bonecp。。。。,各个都系出名门,都号称具有什么什么优势,更有好事者自己开发一个连接池。那为什么要引入连接池呢?换句话说引入连接池会带来什么好处呢?下面就让我们来分析一下,探测一下谜底。
[编辑]解密
[编辑]数据库连接的原理
数据库连接的本底上都是tcp连接,tcp连接位于osi的4层上,所有的数据库驱动都在7层上实现自己的协议。数据库连接的协议一般都是二进制的协议。应用程序和数据库每建一个数据库其实就是在底层建立了一个tcp线路,tcp线路是有底层的操作系统实现的,每个线路占用两个端口,发送端口和接收端口,这两个端口在数据交换过程中会互换角色,时而发送、时而接收。当web应用连接mysql数据库时,目标的接收端口是3306,连接时3306要被明确的指定,此时web应用方也有一个端口被占用,这个端口不需要被明确的指定,是操作系统自动分配的。操作系统的端口数是有限的,一般缺省可能是1024,不同的操作系统会有所不同,每一个socket也是占用资源的,一般叫socket的资源描述符,这些资源对于操作系统来说也是有限的,linux下通过ulimit命令可以指定更多资源。
[编辑]连接无法打开原因
占用端口不释放,每一个socket在调用close后,socket会处于Time_wait状态,处于此状态的socket需要经过一段时间才能释放,这个释放时间随不同的操作系统而不同,socket的不释放导致端口不释放,再次连接时操作系统分配不出端口socket文件描述符不释放,还是上面的原因,socket资源不释放,操作系统不能分配新的资源
[编辑]建立连接的资源开销
java的数据库连接相对来说是重量级的,构建一个连接的系统开销很大,不停的关闭、创建数据库连接对应用系统来说开销太大
[编辑]连接池的应用
连接池是存储、管理数据库连接的容器,应用程序把获取数据库连接的功能委托给连接池,每个连接池都有一个上限,如果连接池达到上限,应用程序线程申请连接时被堵塞,等待其他线程释放连接,每个线程使用完连接后并不马上关闭,至少把它返还给连接池。由于连接的共享,不会频繁的创建、销毁连接,因此就不会增加创建连接的开销,也不会出现socket释放延迟现象。
[编辑]其他
jndi连接池是整个web容器持有,容器内所有的应用共享,有可能造成应用之间的竞争应用级的连接池,粒度较小,容易控制
hibernate只支持c3p0
相关文章推荐
- Java程序为什么需要数据库连接池
- 为什么写Java程序需要接口
- 为什么写Java程序需要接口
- 为什么写Java程序需要接口
- 为什么写Java程序需要接口
- 为什么写Java程序需要接口
- Java程序为什么需要调优(《大话Java性能优化》第一章第一节)
- Java 8为什么需要Lambda表达式
- 在linux上,为什么不用配置环境变量还能运行java程序呢?
- 要想eclipse开发的javaweb程序能在MyEclipse下运行,需要改一下
- ubuntu14.04,安装JDK1.8(JAVA程序需要的开发、运行环境)
- 为什么Java的Web开发需要用到Struts呢?
- Java开发为什么需要UML的理由
- 编写多线程java程序时需要注意哪些问题?(来自于effective java se)
- 为什么VS2008的程序发布时需要manifest
- java 程序为什么总是运行第一个程序
- 为什么执行JAVA程序时,会出现Exception in thread"main" java.lang.NoClassDefFoundError的错?...
- 为什么执行JAVA程序时,会出现Exception in thread"main"java.lang.NoClassDefFoundError的错?
- Java入门:一些初学者需要掌握的基础算法程序——二分查找
- Javaweb开发为什么需要分前后端,放弃原生JSP