连接池技术和数据库事务文档1031要点Word文档下载推荐.docx
《连接池技术和数据库事务文档1031要点Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《连接池技术和数据库事务文档1031要点Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
正式项目中任何功能必须使用连接池。
对于共享资源,有一个很著名的设计模式:
资源池(ResourcePool)。
该模式正是为了解决资源的频繁分配﹑释放所造成的问题。
为解决上述问题,可以采用数据库连接池技术。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。
预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。
更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
连接池的基本工作原理见下图。
2.4.连接池带来的性能提升和安全性
性能比较(连接耗时——通过不断循环n次获取连接和释放连接)
连接次数
分类
10
20
30
40
50
100
连接池
343ms
345ms
335ms
338ms
336ms
337ms
创建连接
594ms
1165ms
1875ms
2291ms
2895ms
6179ms
安全性
可以控制创建出来的数据库连接数,并管理好这些连接,在某个连接超过最大空闲时间时,连接池可以将这个连接交还给数据库,防止数据的崩溃;
若连接数小于最小连接数则新建一个新的连接到连接池中,保证连接池中有最小连接数。
同时还可以防止应用因为无限创建连接造成巨大的资源开销。
2.5.连接池可能有的副作用
(1)连接池的连接数达到最大连接数时,则不能再创建新的连接,需要等待其他连接的释放才能获取到连接。
(2)假如调用的连接没有及时释放回连接池中去,而连接池中没有空闲的连接时,连接池就需要去创建新的连接,当达到最大连接数时,就会发生
(1)的情况,所以在项目开发过程中,要注意及时地将用完结束的连接释放到连接池中去。
(3)使用连接池时,要根据项目需求配置好合理的初始连接数和最大连接数,初始连接数太小,对于高并发的访问空闲连接数不足时需要去创建新的连接,这样换来的代价高。
初始连接数太大,启动初始化时时间比较长,而项目不需要这么多连接,造成资源浪费。
2.6.几种连接池的对比
在项目中有可能用到的开源的连接池主要有DBCP、c3p0、proxool和BoneCP,还有其他的开源连接池还有DDConnectionBroker、DBPoo、XAPool、Primrose、SmartPool等。
下面主要是DBCP、c3p0、proxool和BoneCP这四个开源连接池的比较。
1.DBCP连接池
DBCP可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
使用评价:
在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控。
配置:
需要导入的包:
commons-dbcp.jar和commons-pool.jar(或者用tomcat-dbcp.jar一个包就行)以及数据库驱动包(下略。
其中oracle为classes12.jar;
mysql为mysql-connector-java-5.0.8-bin.jar等)
applicationContext.xml中配置如下:
<
!
--dbcp数据源-->
beanname="
dbcp_dataSource"
class="
mons.dbcp.BasicDataSource"
destroy-method="
close"
>
<
propertyname="
driverClassName"
value="
oracle.jdbc.driver.OracleDriver"
/>
url"
jdbc:
oracle:
thin:
@127.0.0.1:
1521:
orcl"
/>
username"
password"
maxIdle"
20"
maxActive"
50"
/bean>
(主页:
http:
//commons.apache.org/dbcp/)
2.c3p0连接池
c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,此外不提供连接池监控。
c3p0有自动回收空闲连接功能,连接池解决了dbcp无法自动重连问题。
c3p0-0.9.1.2.jar(这个包本身导入spring库的时候就已经导入)以及数据库驱动包。
--c3p0数据源-->
c3p0_dataSource"
com.mchange.v2.c3p0.ComboPooledDataSource"
driverClass"
/property>
user"
jdbcUrl"
value="
maxPoolSize"
minPoolSize"
10"
3.Proxool连接池
Proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码在其他的开源连接池中成功结束,但在Proxool中出现异常退出。
但是Proxool有一个优势--连接池监控。
proxool-0.9.1.jar和proxool-cglib.jar以及数据库驱动包。
配置方法一:
与其他连接池的配置类似,直接在applicationContext.xml中配置:
--proxool数据源-->
--跟dbcp/c3p0一样单独的配置-->
--连接池配置成功,但这种做法监听没办法起来(可能未配置成功)-->
beanid="
proxool_dataSource_1"
class="
org.logicalcobwebs.proxool.ProxoolDataSource"
alias"
usernameDb"
driver"
value="
driverUrl"
maximumConnectionCount"
minimumConnectionCount"
houseKeepingTestSql"
select1fromdual"
配置方法二:
在WebRoot/WEB-INF下新建一个proxool.xml文件,内容如下:
?
xmlversion="
1.0"
encoding="
UTF-8"
something-else-entirely>
proxool>
<
alias>
usernameDb<
/alias>
driver-url>
orcl<
/driver-url>
driver-class>
oracle.jdbc.driver.OracleDriver<
/driver-class>
driver-properties>
<
/driver-properties>
maximum-connection-count>
30<
/maximum-connection-count>
minimum-connection-count>
10<
/minimum-connection-count>
house-keeping-test-sql>
select1fromdual<
/house-keeping-test-sql>
/proxool>
/something-else-entirely>
在web.xml中调用proxool.xml,配置如下:
--引入proxool配置文件-->
servlet>
servlet-name>
proxoolServletConfigurator<
/servlet-name>
servlet-class>
org.logicalcobwebs.proxool.configuration.ServletConfigurator<
/servlet-class>
init-param>
--以xml文件方式引入-->
param-name>
xmlFile<
/param-name>
--xml文件存放目录-->
param-value>
WEB-INF/proxool.xml<
/param-value>
/init-param>
load-on-startup>
1<
/load-on-startup>
/servlet>
在applicationContext.xml中的配置如下:
--与proxool.xml和web.xml里结合使用-->
--连接池配置成功,监听也可以起来-->
proxool_dataSource_2"
org.springframework.jdbc.datasource.DriverManagerDataSource"
org.logicalcobwebs.proxool.ProxoolDriver"
--proxool.xml文件中proxool结点的别名(alias)为usernameDb-->
proxool.usernameDb"
由于proxool连接可以对连接池进行监控,在web.xml中配置
proxoolAdmin<
org.logicalcobwebs.proxool.admin.servlet.AdminServlet<
servlet-mapping>
url-pattern>
/proxoolAdmin<
/url-pattern>
/servlet-mapping>
通过访问proxoolAdmin即可监控连接池的情况
4.BoneCP连接池
BoneCP是一个快速,开源的数据库连接池,可以设置最大和最小连接,连接等待时间等,基本功能都有。
BoneCP连接池帮你管理数据连接让你的应用程序能更快速地访问数据库,比c3p0/DBCP连接池快25倍,并且有自动连接验证和自动重播任何失败的交易的能力(数据库/网络出现故障等情况下),但它的持续运行的稳定性有一定问题。
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_dataSource"
com.jolbox.bonecp.BoneCPDataSource"
maxConnectionsPerPartition"
30"
minConnectionsPerPartition"
总结:
综上所述,这几种开源连接池各有优劣,看了网络上很多评论,大都推荐使用DBCP和c3p0,经检验这种连接池性能稳定,承压能力强。
而Proxool尽管有明显的性能问题,但由于它具备监控功能,因此建议在开发测试时使用,有助于确定是否有连接没有被关掉,可以排除一些代码的性能问题。
BoneCP拥有很高的性能,但是稳定性有一定问题。
另外,各连接池配置常用的一些参数比较如下(参考网址:
DBCP
c3p0
proxool
boneCP
数据库用户名称
Username
User
username
数据库密码
Password
password
驱动名称
DriverClassName
DriverClass
driver-class
driverClass
Jdbc连接串
Url
JdbcUrl
driver-url
jdbcUrl
初始化大小
InitialSize
InitialPoolSize
连接池最小空闲
MinIdle
MinPoolSize
minimum-connection-count
minConnectionsPerPartition
连接池最大空闲
MaxIdle
连接池最大使用连接数量
MaxActive
MaxPoolSize
maximum-connection-count
maxConnectionsPerPartition
最小逐出时间
MinEvictableIdleTimeMillis
maxIdleTime
house-keeping-sleep-time
获取连接时测试是否有效
TestOnBorrow
TestConnectionOnCheckout
test-before-use
归还连接时是否测试有效
TestOnReturn
TestConnectionOnCheckin
test-after-use
连接空闲时测试是否有效
TestWhileIdle
获取连接最大等待时间
maxWait
性能比较,模拟A个线程循环B次并发访问数据库对比:
(网络参考数据,参考网址:
并发数
10A10B
1188ms
953ms
1625ms
63ms
20A10B
1204ms
1000ms
1640ms
110ms
30A10B
1250ms
1047ms
1657ms
156ms
50A10B
1406ms
1343ms
1843ms
172ms
100A10B
1641ms
2703ms
2031ms
532ms
200A10B
2093ms
4891ms
2406ms
936ms
500A10B
3219ms
11703ms
3343ms
1922ms
1000A10B
5187ms
12563ms
4703ms
3610ms
3000A10B
14094ms
16297ms
11344ms
11391ms
5000A10B
23610ms
22032ms
20125ms
17125ms
现在主流的连接池不多,一般选择主流,因为他有很多人共同发现问题,共同调优,并且版本在跟进。
DBCP和C3P0一般是选择最多的。
因为连接池性能本身已经挺高了。
所以如果不是极端情况,并不过分关心性能。
而他们最主要的区别是。
如果某个连接断掉(比如网络不稳定),C3P0会一直等待到超时,如果这期间恢复了连接,他就平滑过渡。
这个特性也不一定就算好事,如果页面访问量大,这个特性可能导致页面等待多了,发生拒绝访问。
根据项目需要选用。
另外hibernate3早期,因为DBCP的BUG而放弃对DBCP的支持。
现在这个BUG应该不需要太过在意。
但是配置的时候,请参考阮杰锋在JIRA上记载的经验。
但如果我们使用专业服务器。
比如weblogic或websphere的时候。
他们自带连接池,而且他们操作图形化,非常方便的调优和监控,往往也能带来便利。
不过这些服务器要钱,只有项目中允许,才能使用。
--数据源-->
dataSource"
destroy-method="
us