生产环境连接池TestOnBorrow设置为false,导致有时获取的连接不可用。分析如下:
- TestOnBorrow=false时,由于不检测池里连接的可用性,于是假如连接池中的连接被数据库关闭了,应用通过连接池getConnection时,都可能获取到这些不可用的连接,且这些连接如果不被其他线程回收的话,它们不会被连接池被废除,也不会重新被创建,占用了连接池的名额。
The last packet successfully received from the server was 19,956 milliseconds ago. The last packet sent successfully to the server was 32 milliseconds ago.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1571)
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3143)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3597)
... 8 more
- 当TestOnBorrow=true时,有两种情况:
① 集群某实例宕掉时,如果连接刚好不处于通信阶段,tcp连接正处于CLOSE_WAIT状态或已关闭,当应用通过连接池getConnection时,在borrow时会检测连接,由于连接已关闭,于是报了如下报错,并重新建立新连接,此时的新连接到集群的其他实例上了。后面能正常通信。
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3143)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:597)
... 21 more
② 集群某实例宕掉时,如果连接刚好处于通信阶段,由于客户端无法立即感知服务端已断连接,它可能会报如下错误,等待服务端的响应超时报错。当应用通过连接池getConnection时,在borrow时会检测连接,由于连接已关闭,于是报了如下报错,并重新建立新连接,此时的新连接到集群的其他实例上了。后面能正常通信。
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 10,538 milliseconds ago. The last packet sent successfully to the server was 10,306 milliseconds ago.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
分享到:
相关推荐
总之,DBCP作为一款经典的数据库连接池实现,虽然现在可能不是最佳选择,但其原理和使用方式对于理解数据库连接池的工作机制仍具有重要的学习价值。在实际项目中,开发者应根据需求和性能要求来选择合适的数据库连接...
**DBCP连接池的工作原理:** 1. **初始化**:在应用程序启动时,DBCP会预先创建一定数量的数据库连接并放入连接池。 2. **请求连接**:当程序需要与数据库交互时,它向连接池请求一个连接。连接池检查是否有空闲的...
使用DBCP连接池,开发者可以通过配置文件设定连接池的参数,如最大连接数、最小连接数、超时时间等,以实现数据库连接的高效利用。 DBCP主要包含以下几个核心组件: 1. **BasicDataSource**:这是DBCP的主要类,...
一、DBCP连接池原理 1. 连接初始化:当应用程序启动时,DBCP会预先创建一定数量的数据库连接并放入连接池中。这些连接在空闲时会被保持,等待后续请求。 2. 连接分配:当应用需要访问数据库时,会从连接池中获取一...
### DBCP连接池优化详解 #### 一、引言 在现代软件开发中,数据库连接池技术的应用极为广泛,特别是在高并发环境下,它可以显著提高应用程序处理能力并降低数据库资源的消耗。Apache DBCP(Database Connection ...
DBCP(Jakarta Commons DBCP)是Apache...通过以上介绍,你已经了解了DBCP连接池的基本概念、配置方法和使用示例。在实际开发中,根据项目的规模和需求,合理配置DBCP可以帮助优化数据库访问,提高应用的性能和稳定性。
DBCP(DataBase Connection Pool)是Apache组织提供的一款Java数据库连接池组件,它是Tomcat服务器默认使用的连接池组件。数据库连接池技术的主要目的是提高系统性能,减少数据库操作中的资源开销,通过预先创建并...
4. **获取与释放连接**: 使用数据源的`getConnection()`方法获取数据库连接,使用完毕后调用`close()`方法返回到连接池,而不是关闭连接: ```java Connection conn = dataSource.getConnection(); // 执行SQL...
本篇文章将深入探讨DBCP的原理、配置与使用方法。 **1. 数据库连接池概念** 数据库连接池是一种在初始化阶段预创建一定数量的数据库连接,并在后续请求时复用这些连接的技术。这减少了创建和销毁数据库连接的开销,...
Apache Commons DBCP(Database Connection Pool)是Java社区中广泛使用的连接池实现之一,它提供了高效、稳定的服务。 **Apache Commons DBCP详解:** 1. **简介** Apache Commons DBCP 是Apache软件基金会的一...
DBCP连接池还有一些其他可配置的参数,例如`maxWait`(最大等待时间),`validationQuery`(用于验证连接是否有效的SQL查询),`testOnBorrow`和`testOnReturn`(在借用或归还连接时是否执行验证)。这些参数可以...
3. **连接池的生命周期**:DBCP连接池的生命周期包括初始化、获取连接、释放连接、关闭连接池等步骤。初始化时,根据配置创建并初始化连接池;获取连接时,如果池中有可用连接则直接返回,否则根据配置创建新连接;...
在配置DBCP连接池时,你通常需要设置以下属性: - `driverClassName`:Oracle JDBC驱动的全限定类名,例如`oracle.jdbc.driver.OracleDriver`。 - `url`:Oracle数据库的连接URL,格式一般为`jdbc:oracle:thin:@...
DBCP允许应用程序直接使用数据库连接池的功能,并且Tomcat的数据源也采用了DBCP作为其底层技术。 #### 二、基本原理 数据库连接池是一种管理和重用预建立数据库连接的技术,目的是为了减少建立和断开数据库连接所...
在使用DBCP连接池时,我们需要将这个驱动添加到类路径中,以便DBCP能识别并建立与MySQL数据库的连接。 在配置DBCP连接池时,通常需要设置以下参数: - **driverClassName**:指定JDBC驱动类名,对于MySQL,这个值...
### 数据源和连接池知识点详解 #### 一、概述 在现代Web开发中,数据库连接是极其宝贵的资源。...此外,选择合适的连接池实现(如DBCP、C3P0或HikariCP)以及正确配置这些连接池,都是优化数据库访问的关键因素。
数据库连接池的基本思想是复用数据库连接,而不是每次需要时都创建新的连接,当应用程序完成对数据库的操作后,不立即关闭连接,而是将其返回到连接池中供其他请求使用。这种机制减少了频繁创建和销毁数据库连接的...
DBCP(Database Connection Pool)是Apache软件基金会提供的一个开源数据库连接池组件,它基于Jakarta Commons DBCP项目。...理解其工作原理和使用方法,对于优化Java应用的数据库访问性能至关重要。
5. **连接池选择**:虽然Tomcat 5.5默认使用了`commons-dbcp`,但随着技术的发展,其他连接池如HikariCP、C3P0等在性能和稳定性上可能有更好表现,可考虑替换使用。 连接池的配置和优化是一个持续的过程,需要根据...