关于配置spring中dbcp2时错误java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z的解决

本文介绍了解决使用DBCP2时遇到的java.lang.AbstractMethodError错误的方法。通过在Spring的配置文件中添加validationQuery属性,成功解决了连接池中的连接验证问题。
  最近使用dbcp2时发现错误:java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z

网上说要更新mysql-connector.jar可是在我更新之后问题还是没有解决,后来浏览国外的网站发现解决方法了

就是在spring的beans.xml中添加<property name="validationQuery" value="${db.validationQuery}" />配置即可解决问题。

具体配置如下:

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${db.driverClassName}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    	<property name="validationQuery" value="${db.validationQuery}" />
    </bean>
	
	<bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties" />
    </bean>
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<bean id="studentDao" class="cn.edu.whpu.dao.impl.StudentDaoImpl">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>
	
	<bean id="studentService" class="cn.edu.whpu.service.impl.StudentServiceImpl">
		<property name="studentDao" ref="studentDao"></property>
	</bean>
	
</beans>

jdbc.properties

db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/db_spring
db.username=root
db.password=123456
db.validationQuery=select 1




`java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z` 是一个典型的由 **MySQL JDBC 驱动版本与运行环境(如 JDK 或应用服务器)不兼容** 导致的错误。该错误通常发生在尝试调用 `Connection.isValid(int timeout)` 方法,而该方法在当前使用的 JDBC 驱动中并未实现。 ### 原因分析 1. **驱动版本过低** `Connection.isValid()` 是在 JDBC 4.0 引入的方法,用于检查连接是否仍然有效。如果使用的 MySQL 驱动版本较低(如 5.0.x 或 5.1.x 的旧版本),其中 `com.mysql.jdbc.Connection` 是抽象类,并未实现此方法,从而在运行抛出 `AbstractMethodError`[^1]。 2. **JDK 或容器要求更高版本接口** 在 JDK 1.8 及以上版本中,某些容器(如 Tomcat 9)或框架(如 Struts)可能会调用 `isValid()` 方法来验证数据库连接。若驱动版本不支持此方法,则会触发该错误[^1]。 --- ### 解决方案 #### 1. 升级 MySQL JDBC 驱动版本 将 MySQL 驱动升级到支持 JDBC 4.0+ 的版本,推荐使用 **MySQL Connector/J 5.1.44 或更高版本**。例如: - 从 `mysql-connector-java-5.0.8-bin.jar` 升级到 `mysql-connector-java-5.1.44-bin.jar`[^1] - 更推荐使用较新的版本如 `mysql-connector-java-8.0.12.jar` 或更新的 8.x 系列版本[^2] #### 2. 检查依赖冲突 确保项目中没有多个版本的 MySQL 驱动共存,这可能导致类加载器加载了错误的版本。可通过检查 `WEB-INF/lib` 目录或 Maven/Gradle 依赖树来排除旧版本。 #### 3. 使用连接池的兼容配置 如果使用了连接池(如 DBCP、C3P0、HikariCP),部分连接池会尝试调用 `isValid()` 来验证连接状态。若驱动不支持,可以改为使用以下方式替代: ```java // 使用传统的 validationQuery 方式 String validationQuery = "SELECT 1"; try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(validationQuery)) { if (rs.next()) { // Connection is valid } } ``` #### 4. 配置连接池跳过 isValid 调用 某些连接池允许配置跳过对 `isValid()` 的调用,例如 HikariCP 可通过设置 `connectionTestQuery` 属性来替代: ```properties connectionTestQuery=SELECT 1 ``` --- ### 版本兼容性建议 | MySQL Connector/J | 支持的 JDK 版本 | 说明 | |-------------------|------------------|------| | 5.1.x | JDK 1.5 - 1.7 | 基础支持 JDBC 4.0 | | 5.1.44+ | JDK 1.8 推荐 | 修复了多个兼容性问题 | | 8.0.x | JDK 1.8+ | 完全支持 JDBC 4.2,推荐使用 | --- ### 示例:Maven 依赖配置(推荐使用 8.x) ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> ``` --- ### 总结 该错误的核心在于 **JDBC 驱动版本过低**,无法满足现代 JDK 或容器对 `Connection.isValid()` 方法的调用需求。升级到 5.1.44 或 8.x 系列的 MySQL 驱动是解决此问题的最直接方法。同,合理配置连接池和排除依赖冲突也是关键步骤。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值