目录
一、池
池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销。这里所说的池是一种广义上的池,比如数据库连接池、线程池、内存池、对象池等。其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象。需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次对象请求可以直接复用。
其他几种池的设计思想也是如此,池技术采用一种以空间换取时间的策略,可以消除对象创建所带来的延迟,从而提高系统的性能。
二、数据库连接池
建立数据库连接是相当耗时和耗费资源的,而且一个数据库服务器能够同时建立的连接数也是有限的,在大型的Web应用中,可能同时会有成百上千个访问数据库的请求,如果Web应用程序为每一个客户请求分配一个数据库连接,将导致性能的急剧下降。为了能够重复利用数据库连接,提高对请求的响应时间和服务器的性能,可以采用连接池技术。
连接池技术预先建立多个数据库连接对象,然后将连接对象保存到连接池中,当客户请求到来时,从池中取出一个连接对象为客户服务,当请求完成后,客户程序调用close()方法,将连接对象放回池中。
在普通的数据库访问程序中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的close()方法,物理连接并没有关闭,数据源的实现只是删除了客户程序中的连接对象和池中的连接对象之间的联系。
同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程
不使用数据库连接池的步骤:
(1)TCP建立连接的三次握手
(2)MySQL认证的三次握手
(3)真正的SQL执行
(4)MySQL的关闭
(5)TCP的四次握手关闭
使用数据库连接池的步骤:
第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。
三、常见连接池
1.DBCP
DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池,是Apache上的一个 java连接池项目,也是 Tomcat使用的连接池组件。DBCP可以直接在应用程序中使用,DBCP没有自动回收空闲连接的功能。
2.C3P0
C3P0是一个开放源代码的JDBC连接池,它实现了数据源和jndi绑定,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。c3p0是异步操作的,缓慢的jdbc操作通过帮助进程完成。扩展这些操作可以有效的提升性能。目前使用它的开源项目有Hibernate等,c3p0有自动回收空闲连接功能。
3.Proxool
Proxool是一种Java数据库连接池技术,是Sourceforge下的一个开源项目。这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。
4.Druid
Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了DBCP、C3P0、Proxool等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池。
Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。