最近网站会出现一个现象是,在并发量大的时候,Tomcat或JBoss的服务线程会线程挂起,同时服务器容易出现数据连接的 java.net.SocketException: Broken pipe 的错误。刚才开始咋一看感觉像是DB端处理不来或是DB端的连接时间到了wait_timeout 的时间强行断开。出于这两个目的,网收集了一些资料后,有的说法是在DB的 wait_timeout 时间后断开的一些连接在连接池中处于空闲状态,当应用层获取该连接后进行的DB操作就会发生上面这个错误。
但在我查看了DBCP连接池代码和做了些测试后,发生这种说法并非正确。
1. 首先,出现 Broken pipe 的错误不是因连接超时所致,这个错误只有在Linux下多发,就是在高并发的情况下,网络资源不足的情况出现的, 会发送SIGPIPE信号,LINUX下默认程序退出的,具体解决办法目前还未找到合适的,有的说法是在Linux的环境变量中设置: _JAVA_SR_SIGNUM = 12 基本就可以解决,但经测试结果看并未解决。对于该问题持续关注中。
2. 之后,Broken pipe 问题未彻底解决,那么对于DBCP连接池只好对一些作废的连接要进行强制回收,若这里不做强制回收的话,最终也就会导致 pool exhausted 了,所以这一步一定要加上保护。配置如下:
- #### 是否在自动回收超时连接的时候打印连接的超时错误
- dbcp.logAbandoned=true
- #### 是否自动回收超时连接
- dbcp.removeAbandoned=true
- #### 超时时间(以秒数为单位)
- dbcp.removeAbandonedTimeout=150
3. 对于DB的 wait_timeout 空闲连接时间设置,在超过该时间值的连接,DB端会强行关闭,经测试结果,即使DB强行关闭了空闲连接,对于DBCP而言在获取该连接时无法激活该连接,会自动废弃该连接,重新从池中获取空闲连接或是重新创建连接,从源代码上看,这个自动完成的激活逻辑并不需要配置任何参数,是DBCP的默认操作。故对于网上的不少说连接池时间配置与DB不协调会导致 Broken pipe 的说法是错误,至少对于DBCP是不会出现该问题,也许C3P0是这样。
不过对于连接池的优化而言,本来就在池里空闲的连接被DB给强行关闭也不件好事,这里可以组合以下几个配置解决该问题:
java 代码
- # false : 空闲时是否验证, 若不通过断掉连接, 前提是空闲对象回收器开启状态
- dbcp.testWhileIdle = true
- # -1 : 以毫秒表示空闲对象回收器由运行间隔。值为负数时表示不运行空闲对象回收器
- # 若需要回收, 该值最好小于 minEvictableIdleTimeMillis 值
- dbcp.timeBetweenEvictionRunsMillis = 300000
- # 1000*60*30 : 被空闲对象回收器回收前在池中保持空闲状态的最小时间, 毫秒表示
- # 若需要回收, 该值最好小于DB中的 wait_timeout 值
- dbcp.minEvictableIdleTimeMillis = 320000
4. 最后,还有一个就是DBCP的maxWait参数,该参数值不宜配置太大,因为在池消耗满时,该会挂起线程等待一段时间看看是否能获得连接,一般到池耗尽的可能很少,若真要耗尽了一般也是并发太大,若此时再挂线程的话,也就是同时挂起了Server的线程,若到Server线程也挂满了,不光是访问DB的线程无法访问,就连访问普通页面也无法访问了。结果是更糕。
这样,通过以上几个配置,DBCP连接池的连接泄漏应该不会发生了(当然除了程序上的连接泄漏),不过对于并发大时Linux上的BrokenPipe 问题最好能彻底解决。但是对于并发量大时,Tomcat或JBoss的服务线程会挂起的原因还是未最终定位到原因,目前解决了DBCP的影响后,估计问题可能会是出现在 mod_jk 与 Tomcat 的连接上了,最终原因也有可能是 broken pipe 所致。关注与解决中……
分享到:
相关推荐
总的来说,DBCP数据库连接池是Java应用程序中提高数据库访问效率的重要工具,通过合理配置和使用,可以显著优化数据库操作性能,降低系统资源消耗。在实际项目中,根据具体需求选择合适的数据库连接池组件,对于提升...
**数据库连接池(DBCP)** 是一个在Java应用程序中管理数据库连接的工具,它能够有效地提高数据库操作的性能和效率。DBCP全称为`Jakarta Commons DBCP`,是Apache软件基金会的一个项目,提供了对数据库连接的池化...
1. **连接创建**:在应用启动时,DBCP会根据配置预先创建一定数量的数据库连接,并将这些连接放入连接池中。这样,在后续的数据库操作中,就不需要每次请求都创建新的连接,节省了系统资源。 2. **连接分配**:当...
综上所述,DBCP数据库连接池是Java Web开发中常用的一种数据库连接管理工具,通过合理的配置和使用,可以显著提高应用的性能和稳定性。在实际项目中,结合Spring等框架,可以更便捷地管理和使用数据库连接。确保正确...
数据库连接池在应用服务器启动时创建一定数量的数据库连接,并将这些连接放入池中,当应用程序需要访问数据库时,可以从连接池中获取一个连接,使用完毕后归还给连接池,而不是直接关闭,这样可以有效地减少数据库...
DBCP(DataBase Connection Pool)是Apache组织提供的一款Java数据库连接池组件,它是Tomcat服务器默认使用的连接池组件。数据库连接池技术的主要目的是提高系统性能,减少数据库操作中的资源开销,通过预先创建并...
DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,主要目的是为了提高数据库连接的复用性,减少创建和销毁连接的开销,从而提升应用的性能。DBCP2是其第二个主要版本,提供了更稳定...
数据库连接池是现代Java应用程序中不可或缺的组件,它有效地管理数据库连接,提高系统性能并减少资源消耗。在本场景中,我们关注的是`dbcp`(Database Connection Pool),这是一个Apache Commons项目,全称为Apache...
总的来说,DBCP是一个高效且易用的数据库连接池实现,对于Java应用开发来说,它能够优化数据库访问性能,提升系统效率,同时提供了丰富的配置选项以适应不同的应用场景。在实际使用中,开发者需要根据应用的规模和...
1. **初始化池:** 应用启动时,DBCP会根据配置预先创建一定数量的数据库连接并存入池中。 2. **请求连接:** 当应用程序需要与数据库交互时,不再直接创建新的连接,而是向连接池申请一个已存在的连接。 3. **使用...
随着`commons-dbcp2`的版本更新,数据库连接池的配置也有了相应的调整。为了更好地理解和配置这些参数,本文将详细解析`commons-dbcp2`中的一些关键参数及其意义。 #### 1. `maxIdle` - **参数描述**:表示连接池中...
NULL 博文链接:https://xiongjiajia.iteye.com/blog/1295094
数据库连接池(Database Connection Pool,简称 DBCP)是一种在多用户并发环境下高效管理数据库连接的技术。它通过预先创建一定数量的数据库连接并存储在内存池中,供多个应用程序共享,从而避免了频繁地创建和关闭...
DBCP(Database Connection Pool)是Apache的一个开源项目,它提供了一个数据库连接池组件,...以上是DBCP数据库连接池的基本使用和配置方法,通过这种方式,可以有效地管理和优化数据库的连接,提高系统的运行效率。
单独使用dbcp需要3个包:commons-dbcp.jar,commons-pool.jar,commons-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库...
数据库连接池(Database Connection Pool,简称 DBCP)是一种在多用户并发访问数据库时提高数据库系统性能的技术。它通过预创建并管理一定数量的数据库连接,避免了每次连接数据库时的初始化开销,同时也能有效地...
而DBCP通过预先配置一定数量的数据库连接,并将这些连接维护在一个池中,应用程序可以随时从池中获取和归还连接,避免了重复的创建和销毁操作,提升了效率。 DBCP的工作原理主要包括以下几个步骤: 1. 初始化:应用...