在java web 应用中使用dbcp做为连接池,当数据库重启或数据库连接超过设置的最大timemout时间,数据库会强行断开已有的链接,此时当web程序访问数据库时就会出现错误,大致的错误信息java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost,原因是数据库这边已有的连接强行断开,而连接池中不知道已经断开,还是从连接池取出数据库连接交给程序去执行数据库操作,所以导致出错。
mysql的默认最大timeout时间是8小时,对空闲超过8小时的数据库连接会强行断开。timeout有两种,一个是非交互式的最大等待时间wait_timeout,另一个是交互式的最大等待时间interactive_time,交互连接如mysql gui tool中的连接。一般情况下interactive_timeout的设置将要对你的web 应用没有多大的影响。wait_timeout的时间设置太小话会导致连接关闭很快,从而使一些持久连接不起作用,反之设置过大,容易造成连接打开时间过长,在show processlist时,能看到太多的sleep状态的连接,从而造成too many connections错误。修改wait_timeout可以在my.cnf的mysqld段中设置。
可以通过dbcp的配置来解决上述的报错。可以用两种方式。
方式一:通过设置validationQuery,例如:
<property name="validationQuery"> <value>select 1</value> </property>
使用上述配置,连接池在返回数据库连接给申请者时会多执行一条sql语句来确保该连接的有效性。如果数据库方已经关闭了,连接池会重新建立连接并返回给申请者。通过测试似乎跟testWhileIdle没有关系,不管其是true或false都正常工作。
方式二:通过配置timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis,例如:
<property name="minEvictableIdleTimeMillis"> <value>60000</value> </property> <property name="timeBetweenEvictionRunsMillis"> <value>10000</value> </property>
在构造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也会使用GenericObjectPool]时,会生成一个内嵌类Evictor,实现自Runnable接口。如果timeBetweenEvictionRunsMillis大于0,每过 timeBetweenEvictionRunsMillis毫秒Evictor会调用evict()方法,检查连接池中的连接的闲置时间是否大于 minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30分钟),是则销毁此对象,然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle。如果连接池的连接数小于最小空闲连接数,则创建数据库连接,同时检查连接池的连接是否小于maxIdle,是则把刚创建的连接放入连接池中,否则销毁此对象。
上述方式一能确保不出现本文开头提到的错误,但是不好的方面是每次执行sql时都会额外执行一条提供的validationQuery sql;第二种方式在数据库重启后minEvictableIdleTimeMillis毫秒前访问web应用,连接数据库使用的还是连接池中老的连接,所以还会出现上述的错误,timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis也不宜设置过小,会加重系统开销。根据具体情况来考虑使用哪种方式。对于数据库可能会经常重启,web应用和数据库机器的网络连接不稳定,可以采取第一种方式,否则使用第二种。由于mysql的默认最大空闲时间8小时,所以只要把minEvictableIdleTimeMillis设置小于此值即可。例如配置每十分钟检查超过空闲一个小时的连接
<property name="minEvictableIdleTimeMillis"> <value>3600000</value> </property> <property name="timeBetweenEvictionRunsMillis"> <value>600000</value> </property>
相关推荐
数据库连接池在应用服务器启动时创建一定数量的数据库连接,并将这些连接放入池中,当应用程序需要访问数据库时,可以从连接池中获取一个连接,使用完毕后归还给连接池,而不是直接关闭,这样可以有效地减少数据库...
在配置DBCP数据库连接池时,你需要以下几个关键的步骤和相关的知识点: 1. **引入依赖**: 标题中提到的"jar包"是配置DBCP连接池的基础。你需要将`commons-dbcp.jar`和`commons-pool.jar`这两个JAR文件添加到你的...
### common-dbcp2数据库连接池参数详解 ...综上所述,正确配置`commons-dbcp2`中的这些参数对于优化数据库性能、确保应用程序的稳定运行至关重要。开发者需要根据实际应用场景仔细评估这些参数的取值,以达到最佳效果。
Java DBCP(Database Connection Pool)数据库连接池是Apache Commons的一个组件,用于管理数据库连接,提高应用程序的性能和效率。...正确配置和使用DBCP能显著提升Java应用的数据库操作性能,降低资源消耗。
总的来说,JDBC是连接数据库的基础,而DBCP则是优化数据库访问的一种手段。结合使用JDBC和DBCP,开发者可以在Java应用中实现高效且易于管理的数据库连接。在实际开发中,理解并掌握这些技术对于构建健壮的数据库应用...
**数据库连接池(DBCP)** 是一个在Java应用程序中管理数据库连接的工具,它能够有效地提高数据库操作的性能和效率。DBCP全称为`Jakarta Commons DBCP`,是Apache软件基金会的一个项目,提供了对数据库连接的池化...
1. **连接创建**:在应用启动时,DBCP会根据配置预先创建一定数量的数据库连接,并将这些连接放入连接池中。这样,在后续的数据库操作中,就不需要每次请求都创建新的连接,节省了系统资源。 2. **连接分配**:当...
DBCP,全称为Jakarta-Commons-DBCP,是一个基于Apache组织开发的开源数据库连接池组件。在Java应用程序中,DBCP可以帮助管理和优化数据库连接,提高应用性能和资源利用率。数据库连接池在多线程环境下尤其重要,因为...
数据库连接池是Java应用中非常重要的一个组件,它在提高应用程序性能、节省系统资源方面起着关键作用。DBCP(Jakarta DBCP)是Apache软件基金会提供的一...在实际开发中,正确配置和使用DBCP是提升系统效率的关键步骤。
在Java应用程序中,特别是在服务器端的Web应用,为了提高数据库访问效率,通常会使用数据库连接池来管理数据库连接。DBCP就是这样一个工具,它通过复用已存在的数据库连接,减少了创建和关闭数据库连接的开销,从而...
6. **异常处理**:DBCP提供了对数据库连接异常的处理机制,如超时、空闲连接检查等,可以防止因长时间未使用的连接导致的问题。 **使用DBCP连接数据库的步骤:** 1. 添加依赖:在项目中引入DBCP的jar包,如`...
总的来说,DBCP数据库连接池是Java应用程序中提高数据库访问效率的重要工具,通过合理配置和使用,可以显著优化数据库操作性能,降低系统资源消耗。在实际项目中,根据具体需求选择合适的数据库连接池组件,对于提升...
DBCP(BasicDataSource)是Apache组织提供的一个开源的JDBC连接池组件,全称为Jakarta Commons DBCP。在Java Web开发中,数据库连接池...确保正确引入DBCP的jar包,并进行适当的配置,是实现高效数据库连接管理的关键。
总的来说,DBCP是一个高效且易用的数据库连接池实现,对于Java应用开发来说,它能够优化数据库访问性能,提升系统效率,同时提供了丰富的配置选项以适应不同的应用场景。在实际使用中,开发者需要根据应用的规模和...
DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,全称为"Commons DBCP"。它提供了一种在Java应用程序中管理数据库连接的方法,通过池化技术来提高性能和效率。数据库连接池是现代...
数据库连接池(Database Connection Pool,简称 DBCP)是一种在多用户并发访问数据库时提高数据库系统性能的技术。它通过预创建并管理一定数量的数据库连接,避免了每次连接数据库时的初始化开销,同时也能有效地...
DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,主要目的是为了提高数据库连接的复用性,减少创建和销毁连接的开销,从而提升应用的性能。DBCP2是其第二个主要版本,提供了更稳定...
而DBCP通过预先配置一定数量的数据库连接,并将这些连接维护在一个池中,应用程序可以随时从池中获取和归还连接,避免了重复的创建和销毁操作,提升了效率。 DBCP的工作原理主要包括以下几个步骤: 1. 初始化:应用...
DBCP(Jakarta Commons DBCP)是Apache软件基金会Jakarta项目下的一个组件,全称为“Jakarta Commons Database Connection ...在实际开发中,正确配置和使用这两个组件对于优化数据库操作和提高应用整体性能至关重要。