ibatis出现java.sql.SQLException: Io 异常: Connection reset

本文详细解析了在服务器运行一段时间后,因数据库连接被回收而导致的连接异常问题。通过在数据库连接配置中加入验证查询,确保连接的有效性,有效避免了无效连接引起的异常。

出现情况:

            在服务器开启一段时间后,再调用数据库连接时就会报这个错,或者网络不稳定是进行数据库查询时也会报这个异常。

异常截图:

 

 

异常原因:

            在连接数据库的线程池中,因为连接了太久没有使用时,系统会回收这个数据库连接,所以过一段时间后执行数据库连接操作时,项目可能会使用这失效的数据库连接去连接数据库,导致这个异常。

 

解决方法:

           在数据库连接配置文件中加入<property name="validationQuery" value="select * from dual" ></property>

这样在进行数据库连接的时候,会先进行测试,测试连接是否可用,如果连接为无效连接则在连接池中重新获取新的数据库连接

原配置文件:

          

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE sqlMapConfig        
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"        
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<settings useStatementNamespaces="true" />
	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" />
			<property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" />
			<property name="JDBC.Username" value="xxx" />
			<property name="JDBC.Password" value="xxx" />
			<property name="JDBC.maxPoolSize" value="20"></property>
			<property name="JDBC.minPoolSize" value="1"></property>
		</dataSource>
	</transactionManager>
	<sqlMap resource="conf/bankCustInfo.xml" />
</sqlMapConfig>

 

修改后:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE sqlMapConfig        
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"        
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<settings useStatementNamespaces="true" />
	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver" />
			<property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" />
			<property name="JDBC.Username" value="xxx" />
			<property name="JDBC.Password" value="xxx" />
			<property name="JDBC.maxPoolSize" value="20"></property>
			<property name="JDBC.minPoolSize" value="1"></property>
                        <property name="validationQuery" value="select * from dual" ></property>
		</dataSource>
	</transactionManager>
	<sqlMap resource="conf/bankCustInfo.xml" />
</sqlMapConfig>

 

上述异常堆栈信息描述了一个典型的数据库连接问题,尤其是在使用 Spring 框架结合 MyBatis 进行数据库操作时。以下是该异常信息的逐层解析: ### 异常结构解析 - **org.apache.ibatis.exceptions.PersistenceException** 是 MyBatis 框架中用于封装所有持久层异常的通用异常类。它通常用于将底层数据库异常封装为更通用的异常类型,以便于上层调用者处理。[^1] - **Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection** 是 Spring 框架中定义的一个异常类,表示无法从数据源中获取 JDBC 连接。这通常是由于数据库连接池耗尽、数据库服务不可用、配置错误等问题导致的。[^1] - **nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!** 是 JDBC 驱动抛出的原始异常,表示底层数据库无法提供连接。这可能是因为数据库服务未启动、网络问题、数据库配置错误(如用户名、密码不正确)、连接池配置不合理等原因导致。 ### 异常含义详解 - **PersistenceException**:表示在执行数据库操作时发生了某种持久化异常,通常由 MyBatis 框架抛出,用于封装底层的 JDBC 异常。 - **CannotGetJdbcConnectionException**:表示 Spring 无法从配置的数据源中获取数据库连接,通常是由于连接池配置问题或数据库服务不可用。 - **SQLException**:表示底层数据库操作中发生了错误,例如连接失败、SQL 语法错误等。在本例中,SQLException 表明无法从数据库获取连接。 ### 常见原因分析 1. **数据库服务未启动或不可用**:数据库服务未运行,或者网络连接存在问题,导致应用程序无法连接到数据库。 2. **连接池配置问题**:如果使用了连接池(如 HikariCP、C3P0 等),可能是连接池的最大连接数设置过小,导致连接被耗尽。 3. **数据库认证失败**:数据库用户名或密码配置错误,导致连接失败。 4. **数据库连接 URL 配置错误**:数据库连接地址(URL)配置错误,导致应用程序无法正确连接到数据库。 5. **驱动类未正确加载**:JDBC 驱动类未正确加载,或者驱动版本与数据库版本不兼容。 ### 解决方案建议 - **检查数据库服务状态**:确保数据库服务已启动,并且可以通过网络访问。 - **验证数据库连接配置**:检查数据库连接 URL、用户名和密码是否正确。 - **调整连接池配置**:增加连接池的最大连接数,避免连接耗尽问题。 - **检查 JDBC 驱动依赖**:确保项目中已正确引入 JDBC 驱动,并且驱动版本与数据库版本兼容。 - **查看日志详细信息**:通过查看详细的日志信息,定位具体的错误原因。 ### 示例代码:检查数据库连接配置 ```java @Configuration public class DataSourceConfig { @Bean public DataSource dataSource() { return DataSourceBuilder.create() .url("jdbc:mysql://localhost:3306/your_database") .username("your_username") .password("your_password") .driverClassName("com.mysql.cj.jdbc.Driver") .build(); } } ``` ### 示例代码:调整连接池配置(HikariCP) ```java @Bean public DataSource dataSource() { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database"); config.setUsername("your_username"); config.setPassword("your_password"); config.setMaximumPoolSize(20); // 设置最大连接数 return new HikariDataSource(config); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值