淘宝联盟推广做网站违法,扁平化高端网站模板,网络服务优势,网站制作详细流程转载自 数据库连接池的选择及其开发配置
一、数据库连接池概述
数据库连接的建立是一种耗时、性能低、代价高的操作#xff0c;频繁的数据库连接的建立和关闭极大的影响了系统的性能。数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中#xff0c;当程序…转载自 数据库连接池的选择及其开发配置
一、数据库连接池概述
数据库连接的建立是一种耗时、性能低、代价高的操作频繁的数据库连接的建立和关闭极大的影响了系统的性能。数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中当程序需要访问数据库时不再建立一个新的连接而是从连接池中取出一个已建立的空闲连接使用完毕后程序将连接归还到连接池中供其他请求使用从而实现的资源的共享连接的建立、断开都由连接池自身来管理。
数据库连接池为系统的运行带来了以下优势昂贵的数据库连接资源得到重用减少了数据库连接建立和释放的时间开销提高了系统响应速度统一的数据库连接管理避免了连接资源的泄露。数据库连接池运行机制
系统初始化时创建连接池程序操作数据库时从连接池中获取空闲连接程序使用完毕将连接归还到连接池中系统退出时断开所有数据库连接并释放内存资源。二、主流数据库连接池比较
常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等1、C3p0:
开源的JDBC连接池实现了数据源和JNDI绑定支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程性能较差适用于小型系统代码600KB左右。2、DBCP
DBCP (Database Connection Pool):由Apache开发的一个Java数据库连接池项目 Jakarta commons-pool对象池机制Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包common-dbcp.jar,common-pool.jar,common-collections.jar预先将数据库连接放在内存中应用程序需要建立数据库连接时直接到连接池中申请一个就行用完再放回。单线程并发量低性能不好适用于小型系统。3、Tomcat Jdbc Pool
Tomcat在7.0以前都是使用common-dbcp做为连接池组件但是dbcp是单线程为保证线程安全会锁整个连接池性能较差dbcp有超过60个类也相对复杂。Tomcat从7.0开始引入了新增连接池模块叫做Tomcat jdbc pool基于Tomcat JULI使用Tomcat日志框架完全兼容dbcp通过异步方式获取连接支持高并发应用环境超级简单核心文件只有8个支持JMX支持XA Connection。4、BoneCP
官方说法BoneCP是一个高效、免费、开源的Java数据库连接池实现库。设计初衷就是为了提高数据库连接池性能根据某些测试数据显示BoneCP的速度是最快的要比当时第二快速的连接池快25倍左右完美集成到一些持久化产品如Hibernate和DataNucleus中。BoneCP特色高度可扩展快速连接状态切换的回调机制允许直接访问连接自动化重置能力JMX支持懒加载能力支持XML和属性文件配置方式较好的Java代码组织100%单元测试分支代码覆盖率代码40KB左右。5、Druid
Druid是Java语言中最好的数据库连接池Druid能够提供强大的监控和扩展功能是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时Druid仍能够保持100%正常运行。主要特色为分析监控设计快速的交互式查询高可用可扩展Druid是一个开源项目源码托管在github上。
主流连接池各项功能对比如下三、连接池Spring集成配置与JNDI配置
下面针对每一种连接池的使用方法在开发中如何配置给出spring集成配置和在tomcat的conf/context.xml文件中配置2种方式限于篇幅只给出基本参数详细参数可自行研究。3.1 阿里Druid连接池
Maven依赖
dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.0.28/version
/dependency
Spring集成配置方式
!--Spring Druid 数据源配置--
bean iddataSource classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose
!-- 基本属性 url、user、password --
property nameurl value${jdbc.url} /
property nameusername value${jdbc.username} /
property namepassword value${jdbc.password} /
!-- 配置初始化大小、最小、最大 --
property nameinitialSize value1 /
property nameminIdle value1 /
property namemaxActive value20 /
!-- 配置获取连接等待超时的时间 --
property namemaxWait value60000 /
!-- 配置间隔多久才进行一次检测检测需要关闭的空闲连接单位是毫秒 --
property nametimeBetweenEvictionRunsMillis value60000 /
!-- 配置一个连接在池中最小生存的时间单位是毫秒 --
property nameminEvictableIdleTimeMillis value300000 /
!-- 打开PSCache并且指定每个连接上PSCache的大小 --
property namepoolPreparedStatements valuetrue /
property namemaxPoolPreparedStatementPerConnectionSize value20 /
!-- 配置监控统计拦截的filters去掉后监控界面sql无法统计 --
property namefilters valuestat /
/beanWeb.xml配置!--druid WebStatFilter用于采集web-jdbc关联监控的数据--filterfilter-nameDruidWebStatFilter/filter-namefilter-classcom.alibaba.druid.support.http.WebStatFilter/filter-classinit-paramparam-nameexclusions/param-nameparam-value*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*/param-value/init-param/filterfilter-mappingfilter-nameDruidWebStatFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--druid访问监控界面 /druid/index.html--servletservlet-nameDruidStatView/servlet-nameservlet-classcom.alibaba.druid.support.http.StatViewServlet/servlet-class/servletservlet-mappingservlet-nameDruidStatView/servlet-nameurl-pattern/druid/*/url-pattern/servlet-mapping
Tomcat中context.xml文件JNDI配置方式
com.alibaba.druid.pool.DruidDataSourceFactory实现了javax.naming.spi.ObjectFactory可以作为JNDI数据源来配置/conf/context.xml配置JNDI方式Resourcenamejdbc/MysqlDataSourcefactorycom.alibaba.druid.pool.DruidDataSourceFactoryauthContainertypejavax.sql.DataSourcedriverClassNamecom.mysql.jdbc.Driverurljdbc:mysql://192.168.1.233:3306/lead_oams?useUnicodetruecharacterEncodingutf-8usernamelead_systempasswordpasswordmaxActive50maxWait10000removeabandonedtrueremoveabandonedtimeout60logabandonedfalsefiltersstat/
web.xml配置!--MySQL数据库JNDI数据 --resource-refdescriptionMySQL DB Connection/descriptionres-ref-namejdbc/MysqlDataSource/res-ref-nameres-typejavax.sql.DataSource/res-typeres-authContainer/res-auth/resource-ref
Java代码中获取JNDI数据源
//1、初始化名称查找上下文Context ctx new InitialContext();
//2、通过JNDI名称找到DataSourceDruidDataSource ds (DruidDataSource)ctx.lookup(java:comp/env/jdbc/MysqlDataSource);
//3、通过ds获取数据库连接对象Connectionconn ds.getConnection();3.2 BoneCP连接池
Maven依赖
dependencygroupIdcom.jolbox/groupIdartifactIdbonecp-spring/artifactIdversion0.8.0.RELEASE/version
/dependency
Spring集成BoneCP配置方式
!-- Spring BoneCP 数据源配置--bean iddataSource classcom.jolbox.bonecp.BoneCPDataSource destroy-methodclose!-- 数据库驱动 --property namedriverClass value${jdbc.driver} /!-- 相应驱动的jdbcUrl --property namejdbcUrl value${jdbc.url} /!-- 数据库的用户名 --property nameusername value${jdbc.username} /!-- 数据库的密码 --property namepassword value${jdbc.password} /!-- 检查数据库连接池中空闲连接的间隔时间单位是分默认值240如果要取消则设置为0 --property nameidleConnectionTestPeriod value60 /!-- 连接池中未使用的链接最大存活时间单位是分默认值60如果要永远存活设置为0 --property nameidleMaxAge value30 /!-- 每个分区最大的连接数 --property namemaxConnectionsPerPartition value150 /!-- 每个分区最小的连接数 --property nameminConnectionsPerPartition value5 //bean
Tomcat中BoneCP使用JNDI配置方式
ResourcenameJNDINameauthContainertypecom.jolbox.bonecp.BoneCPDataSourcefactoryorg.apache.naming.factory.BeanFactorydriverClassoracle.jdbc.driver.OracleDriverusernameroot
passwordroot jdbcUrljdbc:mysql://localhost:3306/testidleConnectionTestPeriod0idleMaxAge10partitionCount1maxConnectionsPerPartition5minConnectionsPerPartition1connectionTestStatementinitSQLselect 1 from dual/
Java代码中获取JNDI数据源
//1、初始化名称查找上下文Context ctx new InitialContext();
//2、通过JNDI名称找到DataSourceDataSource ds (DataSource) ctx.lookup(java:comp/env/jdbc/MysqlDataSource);
//3、通过ds获取数据库连接对象
Connectionconn ds.getConnection();3.3 Tomcat Jdbc Pool连接池
Maven依赖
dependencygroupIdorg.apache.tomcat/groupIdartifactIdtomcat-jdbc/artifactIdversion7.0.75/version
/dependency
dependencygroupIdorg.apache.tomcat/groupIdartifactIdtomcat-juli/artifactIdversion7.0.75/version
/dependency
Spring集成Tomcat Jbdc Pool配置方式
!--tomcat jdbc pool数据源配置-- bean iddataSource classorg.apache.tomcat.jdbc.pool.DataSource destroy-methodcloseproperty namepoolPropertiesbean classorg.apache.tomcat.jdbc.pool.PoolProperties!--driverClassName url username password--property namedriverClassName valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/test?autoReconnecttrueuseUnicodetruecharacterEncodingUTF-8/property nameusername valueroot/property namepassword valueroot/!--jmx support--property namejmxEnabled valuetrue/property nametestWhileIdle valuetrue/property nametestOnBorrow valuetrue/property nametestOnReturn valuefalse/property namevalidationInterval value30000/property namevalidationQuery valueSELECT 1/property nametimeBetweenEvictionRunsMillis value30000/!--最大连接--property namemaxActive value50/!--初始化连接--property nameinitialSize value5/!--最长等待时间ms--property namemaxWait value10000/property nameminEvictableIdleTimeMillis value30000/property nameminIdle value10/!--是否允许日志--property namelogAbandoned valuefalse/property nameremoveAbandoned valuetrue/property nameremoveAbandonedTimeout value60/property namejdbcInterceptors valueorg.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer//bean
Tomcat中context.xml文件JNDI配置方式
Resource
namejdbc/test
authContainer
factoryorg.apache.tomcat.jdbc.pool.DataSourceFactory
testWhileIdletrue
testOnBorrowtrue
testOnReturnfalse
validationQuerySELECT 1
validationInterval30000
timeBetweenEvictionRunsMillis30000
driverClassNamecom.mysql.jdbc.Driver
maxActive100
maxIdle40
maxWait12000
initialSize10
removeAbandonedTimeout60
removeAbandonedtrue
logAbandonedtrue
minEvictableIdleTimeMillis30000
jmxEnabledtrue
jdbcInterceptors org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer
usernameroot
passwordroot
typejavax.sql.DataSource
urljdbc:mysql://localhost:3306/test?characterEncodingUTF-8/
Java代码中获取JNDI数据源
//1、初始化名称查找上下文Context ctx new InitialContext();
//2、通过JNDI名称找到DataSource
DataSource ds (DataSource) ctx.lookup(java:comp/env/jdbc/test);
//3、通过ds获取数据库连接对象
Connectionconn ds.getConnection();3.4 Apache DBCP连接池
Maven依赖
dependencygroupIdcommons-dbcp/groupIdartifactIdcommons-dbcp/artifactIdversion1.4/version
/dependency
dependencygroupIdcommons-collections/groupIdartifactIdcommons-collections/artifactIdversion3.2.2/version
/dependency
dependencygroupIdcommons-pool/groupIdartifactIdcommons-pool/artifactIdversion1.6/version
/dependency
Spring集成DBCP配置方式!-- 配置dbcp数据源 --bean iddataSource destroy-methodclose classorg.apache.commons.dbcp.BasicDataSource
property namedriverClassName value${jdbc.driverClassName}/
property nameurl value${jdbc.url}/
property nameusername value${jdbc.username}/
property namepassword value${jdbc.password}/
!-- 池启动时创建的连接数量 --
property nameinitialSize value5/
!-- 同一时间可以从池分配的最多连接数量。设置为0时表示无限制。 --
property namemaxActive value50/
!-- 池里不会被释放的最多空闲连接数量。设置为0时表示无限制。 --
property namemaxIdle value10/
!-- 在不新建连接的条件下池中保持空闲的最少连接数。 --
property nameminIdle value3/
!-- 设置自动回收超时连接 --
property nameremoveAbandoned valuetrue /
!-- 自动回收超时时间(以秒数为单位) --
property nameremoveAbandonedTimeout value200/
!-- 设置在自动回收超时连接的时候打印连接的超时错误 --
property namelogAbandoned valuetrue/
!-- 等待超时以毫秒为单位在抛出异常之前池等待连接被回收的最长时间当没有可用连接时。设置为-1表示无限等待。--
property namemaxWait value100/ /bean
Tomcat中context.xml文件JNDI配置方式
Resource name/jdbc/test typejavax.sql.DataSource driverClassNamecom.sybase.jdbc3.jdbc.SybDataSource urljdbc:mysql://localhost:3306/test?characterEncodingUTF-8 usernameroot passwordroot initialSize5maxActive50 maxIdle10 minIdle3maxWait50000 /
Java代码中获取JNDI数据源
//1、初始化名称查找上下文
Context ctx new InitialContext();
//2、通过JNDI名称找到DataSource
DataSource ds (DataSource) ctx.lookup(java:comp/env/jdbc/test);
//3、通过ds获取数据库连接对象
Connectionconn ds.getConnection();3.5 C3p0连接池
Maven依赖
dependencygroupIdc3p0/groupIdartifactIdc3p0/artifactIdversion0.9.1.2/version
/dependency
Spring集成配置方式
!-- Spring配置c3p0数据源 --
bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSource destroy-methodclose
property namejdbcUrl value${jdbc.url} /
property namedriverClass value${jdbc.driverClassName} /
property nameuser value${jdbc.username} /
property namepassword value${jdbc.password} /
!--连接池中保留的最大连接数。Default: 15 --
property namemaxPoolSize value100 /
!--连接池中保留的最小连接数。--
property nameminPoolSize value1 /
!--初始化时获取的连接数取值应在minPoolSize与maxPoolSize之间。Default: 3 --
property nameinitialPoolSize value10 /
!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --
property namemaxIdleTime value30 /
!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --
property nameacquireIncrement value5 /
!--JDBC的标准参数用以控制数据源内加载的PreparedStatements数量。Default: 0--
property namemaxStatements value0 /
!--每60秒检查所有连接池中的空闲连接。Default: 0 --
property nameidleConnectionTestPeriod value60 /
!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --
property nameacquireRetryAttempts value30 /
!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。Default: false--
property namebreakAfterAcquireFailure valuetrue /
!--因性能消耗大请只在需要的时候使用它。Default: false --
property nametestConnectionOnCheckout valuefalse /
/bean
Tomcat中context.xml文件JNDI配置方式
Resource namejdbc/MysqlDataSource authContainerfactoryorg.apache.naming.factory.BeanFactory typecom.mchange.v2.c3p0.ComboPooledDataSourcedriverClasscom.mysql.jdbc.DriveridleConnectionTestPeriod60maxPoolSize50 minPoolSize2acquireIncrement2 userroot passwordrootjdbcUrljdbc:mysql://localhost:3306/test/
Java代码中获取JNDI数据源
//1、初始化名称查找上下文
Context ctx new InitialContext();
//2、通过JNDI名称找到DataSource
DataSource ds (DataSource) ctx.lookup(java:comp/env/jdbc/MysqlDataSource);
//3、通过ds获取数据库连接对象
Connectionconn ds.getConnection();
总结
本文所比较的5种数据库连接池在性能方面根据个人测试结果和参考网上资料Druid TomcatJDBC DBCP C3P0BoneCP的性能方面没有深入比较应该和Tomcat Jdbc差不多。
对于小型的系统并发压力不大时选择哪一种数据库连接池差别不会很大主要考虑的应该是连接池的稳定性。当并发量较高时一般不会选择使用DBCP和C3P0选择Druid是较好的。
本文给出了5种数据库连接池通过Spring配置和Tomcat JNDI方式配置两种方式Spring配置一般使用单独的属性文件每一个连接池都提供了使用代码创建的方式使用方式也比较类似感兴趣可以自行研究。
另外连接不同的数据库时在配置方面的差异主要在driverClass和jdbcUrl两项优化配置项可以另行考虑。