DBCP的使用总结

DBCP用了有一段时间了,在并发相对较大的情况下也没出现过什么问题,至少能满足现网系统的要求。就在不久之前,遇到了一个怪异的问题:

启动应用,能访问数据库,但过了一段时间,约两个小时左右,系统就出现访问“卡住”的现象,用网页打开,不停的处于加载状态,就是加载不出来。

通过测试,就定位到了链接数据库出现问题了,因为都是运行一段时间就出现“卡死”状态,通过以前的经验立刻判断,会不会是因为某个线程吊死了,所以接下来的线程全部卡在这里了,因为这个DBCP用了也有一段时间了,觉得他的问题不大,如果有问题的话应该早就出现了。所以开始就从代码入手。经过详细的排查和测试,也发现不了代码有什么问题,几乎吧所有复杂或有干扰的代码都去掉了,还是会出现这个问题,通过查看日志,也没发现有报错现象,那就纳闷了,有问题,但又不报错,怎么回事。

再后来,我坚信是DBCP的问题, 回想起以前查DBCP资料的时候,有看到说关于DBCP有bug的问题,我心想难道是这个问题导致?我立刻搜索相关资源,也没什么特别明确的资料,因为系统没有报错信息。因为系统快要上线了,这个问题解决不了,我想觉肯定睡不好,于是我被这个问题降低了我的睡眠质量。第二天,我进一步详细的排查了日志信息,发现了昨晚链接数据库的报错信息:java.sql.SQLException: Io 异常: 连接超时。

ohmy god,难道数据库问题,没可能,我昨晚排除了数据库服务器问题,在仔细检查日志信息,发现空闲链接是有的,为什么就不能连呢。再发现今天能连接数据库了,再看日志,空闲数0和1之间徘徊,开始有点头绪了,带着疑问google和百度了一下,再结合自己的测试,原来是这样:程序启动的时候新建立的数据源没有用,过了数据库的超时时间,就获取不到真正的连接了,就在那死等超时。也是因为没有对DBCP了解透切,所以以前在配置的时候直接大概能用就行,而且用了那么长的一段时间没有问题,就更加肯定这个配置的信息。之前的系统没有问题,是因为系统24小时总有人访问,而且量不小,所以连接池的连接总是在使用,没有超过数据库的会话链接超时时间,并且连接数一超过了空闲数,就是重新获取新链接,就算空闲的访问不了,新的一样会访问。那个无效的链接只是在等超时而已,其实问题已经存在,只不过自己没有注意而已。幸好问题发现了,让我对这DBCP有了更深的认识。

后来的处理就是多加了TestWhileIdle、TimeBetweenEvictionRunsMillis、NumTestsPerEvictionRun、MinEvictableIdleTimeMillis等参数进行了调优,大概就是多加了DBCP的监控线程,让他检查数据源连接的有效性,而且还要结合自身数据库等环境进行配置。

具体的配置参数可以参考一下链接:

http://agapple.iteye.com/blog/791943

http://www.blogjava.net/aoxj/archive/2008/02/19/180704.html

最后要提醒一下自己:别浮躁,要细心。

DBCP的使用总结,布布扣,bubuko.com

时间: 2024-10-13 20:10:43

DBCP的使用总结的相关文章

DBCP连接池使用问题

问题现象: 启动应用,访问无压力,一切正常,一段时间过后,应用访问异常. 问题分析: 1.web容器线程爆满,拒绝服务.由于应用并发量大,线程响应时间长增加,线程池连接数逐步递增直到爆满,导致应用拒绝服务. 2.通过对线程信息的分析,发现线程处理时间都卡在连接数据库中,通过对数据库服务器的检查,数据库是没有问题的. 3.通过查询服务器日志,发现数据库连接异常:连接超时. 4.查询DBCP连接池连接使用情况,空闲链接和使用链接还正常. 问题思考: 从以上信息可以确认,问题一定出在应用层,并且是应用

DBCP连接池与c3p0连接池

1.   DBCP连接池 2.  c3p0连接池(参见上一篇的使用步骤http://www.cnblogs.com/qlqwjy/p/7545012.html)

DBCP数据库连接池的简单使用

0.DBCP简介      DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目.DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中),应用程序需要建立数据库连接时直接到从接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用,减少资源消耗的目的. 1.DBCP所依赖的jar包(以下例子基于如下jar包版本)    commons-dbcp2-2.1.1.jar       commons-logging-

Spring数据库连接池 c3p0、dbcp、spring-jdbc

在用dbcp的时候 后面加上 destroy-method="close" 销毁的方法没事 但是用 spring的jdbc就会报错 提示找不到close这个方法  这是为什么? DBCP DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为

DBCP连接池简介

DBCP连接池简介 1.数据库连接基础 数据库连接池基础主要包括以下三个方面的内容:数据库连接池的基本概念.数据库连接池的工作原理.Java开源的连接池.下面将从这三个方面一一介绍: (1)数据库连接池的基本概念 数据库连接是一种关键的.有限的.昂贵的资源,这一点在多用户的Web应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.因此,数据库连接池正是针对这个问题提出来的. 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用

解读dbcp自动重连那些事(转)

本文转自:http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方式,不一样的效果. Hi all : 最近在做 offerdetail 优化时,替换了数据库驱动,从 c3p0 0.9.1 -> dbcp 1.4 , 顺便研究了下 dbcp 的自动重连的一套机制,也做一下分享,大家周知一下. 数据库链接 常见的问题: 1. 数据库意外重启后,原先的数据库连接池能

c3p0、dbcp和proxool比较

现在常用的开源数据连接池主要有c3p0.dbcp和proxool三种,其中:  hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置,这个设置可以解决); hibernate in action推荐使用c3p0和proxool; dbcp所需jar:commons-dbcp.jar.commons-pool.jarc3p0所需jar:c3p0-0.9

JDBC数据源DBCP源代码情景分析

在之前的一篇博文从JDBC到commons-dbutils 中,我曾经写到,对于获取数据库连接,有一个解决方案,那就是数据源.业界用到的比较普遍的开源数据源解决方案有很多,DBCP是其中一种,今天,我试图从源代码角度去解读这个解决方案. 全文分为三节,第一节介绍DBCP一般的用法,第二节按照第一节中给出的用法,从源代码角度看看,到底程序经过了哪些步骤,第三小节对全文做一个总结. 1.DBCP的一般用法 DBCP的用法其实很简单,一般就是new一个BasicDataSource,然后设置参数,当需

java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法

java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法 只需把这三个commons-pool.jar.commons-dbcp-1.2.2.jar和commons-collections-3.2.jar包加入到lib里即可解决.这三个包在你本地的tomcat下的lib里,直接buildpath导入就行了,不过有时导包不一定好使,是因为工程lib下的包跟tomcat下的包重复了,导致异常错误如: o

DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较

 简介   使用评价  项目主页  DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用 可以设置最大和最小连接,连接等待时间等,基本功能都有,此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控 http://homepages.nildram. co.uk/~slink/java/DBPool/  C3P0  C3P0是一个开放源代码的JDBC连接池,它在lib目录