tomcat-jdbc-pool实践

上头要求切换项目连接池,把druid切换为内部封装的tomcat-jdbc-pool。初次接触这个连接池,记录一下使用过程。

 

一、配置代码

a. 连接池配置(applicationContext-pool.xml)

<!-- tomcat-jdbc-pool数据源配置 start -->
<bean id="baseDataSource" class="com.xxx.jdbc.pool.DataSource" abstract="true" destroy-method="close">
    <property name="poolProperties">
        <bean class="com.xxx.jdbc.pool.PoolProperties">
	    <property name="initialSize" value="${jdbc.initialSize}" />
	    <property name="maxActive" value="${jdbc.maxActive}" />
	    <property name="maxIdle" value="${jdbc.maxIdle}" />
	    <property name="minIdle" value="${jdbc.minIdle}" />
	    <property name="maxWait" value="${jdbc.maxWait}" />
            <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}" />
	    <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />
	    <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />
	    <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
	    <property name="testOnReturn" value="${jdbc.testOnReturn}" />
	    <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
	    <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
	    <property name="validationInterval" value="${jdbc.validationInterval}" />
	    <property name="validationQuery" value="${jdbc.validationQuery}" />
	    <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}" />
	    <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
	    <property name="jdbcInterceptors" value="${jdbc.jdbcInterceptors}" />
	    <property name="logAbandoned" value="${jdbc.logAbandoned}" />
	    <property name="fairQueue" value="${jdbc.fairQueue}" />
	</bean>
    </property>
</bean>
<!-- 此处bean name不能为dataSource -->
<bean id="masterDataSource" name="masterDataSource" parent="baseDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>
<!-- 需注意如果抛Layered pools are not allowed.是因为setDataSource与Spring的byName依赖注入冲突,springbean的名称不能出现dataSource同名id -->
<!-- tomcat-jdbc-pool数据源配置 end -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="masterDataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

b.配置(properties)

# start 统一连接池
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=xxxxxx
jdbc.password=xxxxx
jdbc.url=jdbc:mysql://xxxxx:3306/xxxxxx?characterEncoding=utf-8&useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
jdbc.initialSize=10
jdbc.minIdle=15
jdbc.maxActive=30
# 默认maxActive相同
jdbc.maxIdle=25
# 获得connection超时寸间,时间单位(毫秒),请根据你的项目中现有的情况配置,默认10秒 
jdbc.maxWait=10000
# 检查数据库连接的SQL (注意:以下例句只适合MySQL,Oracle为select 1 from dual)
jdbc.validationQuery=select 1
# 在空闲连接回收器线程运行期间休眠细时间值,以毫秒为单位。如果设置为非正数。则不运行空和连接回收器线程,这个值不应该小于1秒。
jdbc.timeBetweenEvictionRunsMillis=5000
# 连接在边中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位(毫秒)
jdbc.minEvictableIdleTimeMillis=30000
# 在connection空闲时进行校验,true是建议值
jdbc.testWhileIdle=true
# borrowObject时对拿到的connection进行校验,true是建议值
jdbc.testOnBorrow=false
# returnObject对返回的connection进行校验,false是建议值
jdbc.testOnReturn=false
# 是否开启自动提交(driver default)
jdbc.defaultAutoCommit=true   
# 如果设置为true,连接被认为是被泄露并且可以被删除,如果空闲时间超过removeAbandonedTimeout。 设置为true 可以为写法糟糕的没有关闭连接的程序修复数据库连接。 
jdbc.removeAbandoned=true
# 回收未关闭连接白时间阀值时间单位秒,请根据你的项目中现有的情况配置
jdbc.removeAbandonedTimeout=60
# 避免过度验证,保证验证不超过这个频率,以毫秒为单位。如果一个连接应该被验证,但上次验证未达到指定间隔,将不再次验证。
jdbc.validationInterval=30000
# 在每次空闲连接回收器线程(如果有)运行时检查的连接数里
jdbc.numTestsPerEvictionRun=3
# JDBC拦截器,设置tomcat idbs连接地的拦截器。内置的拦截器: ConnectionState追踪自动提交、只读状态
# StatementFinalizer追踪打开的statement,当连接被归还时关闭它们.
# 注意,一般是没有的,有时候会报错找不到这个拦截器,建议不写这条
jdbc.jdbcInterceptors=StatementFinalizer
# (boolean) 标记当Statement 或连接被泄露时是否打印程序的stack traces 日志。被泄露的Statements 和连接的日志添加在每个连接打开或者生成新的Statement, 因为需要生成stack trace。默认false 
jdbc.logAbandoned=false
# (boolean) 如果被设为true ,getConnection方法将被以先进先出的方式对待。默认true
jdbc.fairQueue=true
# end

某些配置属性可以自己去看看参考资料

c. 需要自己配置一些加载properties的propertiesConfig和mybatis配置,就不赘述了

 

二、问题和思考

1、中途出过Layered pools are not allowed异常,原因是设置的bean注入default-autowire="byName",而我的DataSource定义里有设置name="dataSource"导致冲突。修改bean的命名即可解决。然而为什么不能命名dataSource呢?,poolProperties里面的运行机制是什么?

异常出处源码

 

2、回顾了一下spring的依赖注入,bean的parent和abstract属性,它们的作用

 

三、参考资料

 

Layered pools are not allowed

tomcat-jdbc-pool官方文档

tomcat-jdbc-pool参数说明

bean的parent和abstract属性

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值