1、正式项目中任何功能必须使用连接池。对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量使用情况,为系统开发测试及性能调整提供依据。连接池的基本工作原理见下图。2.4. 连接池带来的性能提升和安全
2、性性能比较(连接耗时通过不断循环n次获取连接和释放连接)连接次数分类1020304050100连接池343ms345ms335ms338ms336ms337ms创建连接594ms1165ms1875ms2291ms2895ms6179ms安全性可以控制创建出来的数据库连接数,并管理好这些连接,在某个连接超过最大空闲时间时,连接池可以将这个连接交还给数据库,防止数据的崩溃;若连接数小于最小连接数则新建一个新的连接到连接池中,保证连接池中有最小连接数。同时还可以防止应用因为无限创建连接造成巨大的资源开销。2.5. 连接池可能有的副作用(1) 连接池的连接数达到最大连接数时,则不能再创建新的连接,需
3、要等待其他连接的释放才能获取到连接。(2) 假如调用的连接没有及时释放回连接池中去,而连接池中没有空闲的连接时,连接池就需要去创建新的连接,当达到最大连接数时,就会发生(1)的情况,所以在项目开发过程中,要注意及时地将用完结束的连接释放到连接池中去。(3) 使用连接池时,要根据项目需求配置好合理的初始连接数和最大连接数,初始连接数太小,对于高并发的访问空闲连接数不足时需要去创建新的连接,这样换来的代价高。初始连接数太大,启动初始化时时间比较长,而项目不需要这么多连接,造成资源浪费。2.6. 几种连接池的对比在项目中有可能用到的开源的连接池主要有DBCP、c3p0、proxool和BoneCP,
4、还有其他的开源连接池还有DDConnectionBroker、DBPoo、XAPool、Primrose、SmartPool等。下面主要是DBCP、c3p0、proxool和BoneCP这四个开源连接池的比较。1. DBCP连接池DBCP可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控。配置:需要导入的包:commons-dbcp.ja
5、r和commons-pool.jar(或者用tomcat-dbcp.jar一个包就行)以及数据库驱动包(下略。其中oracle为classes12.jar;mysql为mysql-connector-java-5.0.8-bin.jar等)applicationContext.xml中配置如下:bean name=dbcp_dataSource class=mons.dbcp.BasicDataSource destroy-method=close urljdbc:oracle:thin:127.0.0.1:1521:orcl /usernamepasswordmaxIdle20maxActi
6、ve50/bean(主页:http:/commons.apache.org/dbcp/)2. c3p0连接池c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,此外不提供连接池监控。c3p0有自动回收空闲连接功能,连接池解决了dbcp无法自动重连问题。c3p0-0.9.1.2.jar(这个包本身导入spring库的时候就已经导入)以及数据库驱动包。- c3p0数据源 -c3p0_dataSourcecom.mchange.v2.c3p
7、0.ComboPooledDataSourcedriverClass/propertyuserjdbcUrl value=maxPoolSizeminPoolSize103. Proxool连接池Proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码在其他的开源连接池中成功结束,但在Proxool中出现异常退出。但是Proxool有一个优势-连接池监控。proxool-0.9.1.jar和proxool-cglib.j
8、ar以及数据库驱动包。配置方法一:与其他连接池的配置类似,直接在applicationContext.xml中配置:- proxool数据源 - 跟dbcp/c3p0一样单独的配置 - 连接池配置成功,但这种做法监听没办法起来(可能未配置成功) -bean id=proxool_dataSource_1class=org.logicalcobwebs.proxool.ProxoolDataSourcealiasusernameDbdrivervalue=driverUrlmaximumConnectionCountminimumConnectionCounthouseKeepingTestSq
9、lselect 1 from dual配置方法二:在WebRoot/WEB-INF下新建一个proxool.xml文件,内容如下:?xml version=1.0 encoding=UTF-8something-else-entirelyproxool usernameDbdriver-urlorcldriver-classoracle.jdbc.driver.OracleDriverdriver-properties maximum-connection-count30minimum-connection-count10house-keeping-test-sqlselect 1 from
10、dual/proxool/something-else-entirely在web.xml中调用proxool.xml,配置如下:- 引入proxool配置文件 -servletservlet-nameproxoolServletConfiguratorservlet-classorg.logicalcobwebs.proxool.configuration.ServletConfiguratorinit-param- 以xml文件方式引入 -param-namexmlFile- xml文件存放目录 -param-valueWEB-INF/proxool.xml/init-paramload-o
11、n-startup1/servlet在applicationContext.xml中的配置如下:- 与proxool.xml和web.xml里结合使用- 连接池配置成功,监听也可以起来 -proxool_dataSource_2org.springframework.jdbc.datasource.DriverManagerDataSourceorg.logicalcobwebs.proxool.ProxoolDriver- proxool.xml文件中proxool结点的别名(alias)为usernameDb -proxool.usernameDb由于proxool连接可以对连接池进行监控
12、,在web.xml中配置proxoolAdminorg.logicalcobwebs.proxool.admin.servlet.AdminServleturl-pattern/proxoolAdmin/servlet-mapping 通过访问proxoolAdmin即可监控连接池的情况4. BoneCP连接池BoneCP是一个快速,开源的数据库连接池,可以设置最大和最小连接,连接等待时间等,基本功能都有。BoneCP连接池帮你管理数据连接让你的应用程序能更快速地访问数据库,比c3p0/DBCP连接池快25倍,并且有自动连接验证和自动重播任何失败的交易的能力(数据库/网络出现故障等情况下),但
13、它的持续运行的稳定性有一定问题。bonecp-0.7.1-rc1.jar、guava-r07.jar、slf4j-api-1.5.8.jar和slf4j-log4j12-1.5.8.jar(这些包从官网上下载下来的时候是zip压缩包,将拓展名改为jar就可以了)以及数据库驱动包。- BoneCP数据源 -boneCP_dataSourcecom.jolbox.bonecp.BoneCPDataSourcemaxConnectionsPerPartition30minConnectionsPerPartition总结: 综上所述,这几种开源连接池各有优劣,看了网络上很多评论,大都推荐使用DBCP
14、和c3p0,经检验这种连接池性能稳定,承压能力强。而Proxool尽管有明显的性能问题,但由于它具备监控功能,因此建议在开发测试时使用,有助于确定是否有连接没有被关掉,可以排除一些代码的性能问题。BoneCP拥有很高的性能,但是稳定性有一定问题。另外,各连接池配置常用的一些参数比较如下(参考网址:DBCPc3p0proxoolboneCP数据库用户名称UsernameUserusername数据库密码Passwordpassword驱动名称DriverClassNameDriverClassdriver-classdriverClassJdbc连接串UrlJdbcUrldriver-urljd
15、bcUrl初始化大小InitialSizeInitialPoolSize连接池最小空闲MinIdleMinPoolSizeminimum-connection-countminConnectionsPerPartition连接池最大空闲MaxIdle连接池最大使用连接数量MaxActiveMaxPoolSizemaximum-connection-countmaxConnectionsPerPartition最小逐出时间MinEvictableIdleTimeMillismaxIdleTimehouse-keeping-sleep-time获取连接时测试是否有效TestOnBorrowTest
16、ConnectionOnCheckouttest-before-use归还连接时是否测试有效TestOnReturnTestConnectionOnCheckintest-after-use连接空闲时测试是否有效TestWhileIdle获取连接最大等待时间maxWait性能比较,模拟A个线程循环B次并发访问数据库对比:(网络参考数据,参考网址:并发数10A10B1188ms953ms1625ms63ms20A10B1204ms1000ms1640ms110ms30A10B1250ms1047ms1657ms156ms50A10B1406ms1343ms1843ms172ms100A10B16
17、41ms2703ms2031ms532ms200A10B2093ms4891ms2406ms936ms500A10B3219ms11703ms3343ms1922ms1000A10B5187ms12563ms4703ms3610ms3000A10B14094ms16297ms11344ms11391ms5000A10B23610ms22032ms20125ms17125ms现在主流的连接池不多,一般选择主流,因为他有很多人共同发现问题,共同调优,并且版本在跟进。DBCP 和C3P0 一般是选择最多的。因为连接池性能本身已经挺高了。所以如果不是极端情况,并不过分关心性能。而他们最主要的区别是。如
18、果某个连接断掉(比如网络不稳定),C3P0会一直等待到超时,如果这期间恢复了连接,他就平滑过渡。这个特性也不一定就算好事,如果页面访问量大,这个特性可能导致页面等待多了,发生拒绝访问。根据项目需要选用。另外hibernate3早期,因为DBCP的BUG而放弃对DBCP的支持。现在这个BUG应该不需要太过在意。但是配置的时候,请参考阮杰锋在JIRA上记载的经验。但如果我们使用专业服务器。比如weblogic或websphere的时候。他们自带连接池,而且他们操作图形化,非常方便的调优和监控,往往也能带来便利。不过这些服务器要钱,只有项目中允许,才能使用。- 数据源 -dataSource destroy-method=us
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1