DBCP 1.X 导致的生产环境部署问题

本文记录了一次使用DBCP连接池时遇到的问题及解决方案,包括线程阻塞、首次查询缓慢等问题,并探讨了可能的原因及配置优化方法。
      应用部署到生产环境,启动后,首次登录没问题。再过几分钟或者说再次登录,却出现登录没响应、查询数据界面没响应等数据库查询没响应的问题,但奇怪的是后台没任何不报错。

       初步怀疑是数据库会话数爆满引起的,通过LambdaProbe监控工具,发现应用不响应的时候,存在线程阻塞的情况。

       于是  jstack 打印线程快照,如下

"http-80-2" daemon prio=10 tid=0x00007fe67400b000 nid=0x4c04 waiting for monitor entry [0x00007fe669733000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:781)
    - waiting to lock <0x00000007a1cbe900> (a org.apache.commons.pool.impl.GenericObjectPool)
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)

       查了相关DBCP连接池的相关资料,大胆推测是DBCP的BUG问题。

      于是将DBCP相关两个依赖包commons-dbcp、commons-pool 为2.X版本,作相关调整后,重新部署应用,线程阻塞问题得以解决。

       但却出现了新的问题:首次查询数据库缓慢,等待时间长问题再见

       问题定位:Apache DBCP连接池获取数据库Connection耗时长

       原因是数据库DBA对系统连接资源,进行了限制,空闲连接数据库会进行释放,而系统中默认配置的DBCP连接池,是不对池中的连接做测试的,有时连接已断开了,但DBCP连接池不知道,还以为连接是好的。

       解决思路:

  • 定时对连接做测试,测试失败就关闭连接。
  • 控制连接的空闲时间达到N分钟,就关闭连接,然后连接池可再新建连接。

DBCP设置如下:

testWhileIdle = "true"                      指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
testOnBorrow = "false"                      借出连接时不要测试,否则很影响性能
timeBetweenEvictionRunsMillis = "120000"    每2分钟运行一次空闲连接回收器
minEvictableIdleTimeMillis = "600000"       池中的连接空闲10分钟后被回收,默认值是30分钟。
numTestsPerEvictionRun="3"                  每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值是3.

问题得以解决。


      可是奇怪的是集成环境,以及其它采用DBCP 1.X 的应用均没出现线程阻塞或首次查询没响应或响应慢的问题。

      在后来的MapReduce导数据到Hbase时,证实是因为应用服务器与数据库服务器间的网络不好引发DBCP相关BUG问题,由于公司部门框架限制,可以的话,还是建议使用其它连接池工具。

09-Sep-2025 17:23:26.604 严重 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployWARs 等待WAR文件的多线程部署完成时出错 java.lang.InterruptedException at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:404) at java.util.concurrent.FutureTask.get(FutureTask.java:191) at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:762) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:426) at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1612) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:304) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1159) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1385) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1353) at java.lang.Thread.run(Thread.java:748) 09-Sep-2025 17:23:35.778 警告 [localhost-startStop-2] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstance Name = happs Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have set value of "100" for "maxActive" property, which is being ignored. 09-Sep-2025 17:23:35.780 信息 [localhost-startStop-2] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstance Name = happs Ignoring unknown property: value of "10" for "minPoolSize" property 09-Sep-2025 17:23:35.780 信息 [localhost-startStop-2] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstanc针对这个问题的报错及解决
最新发布
09-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值