Java 捕获 mybatis异常_Spring与Mybatis整合后的SQL异常捕获

优秀文章

相关框架

后台:Spring,Mybatis

记录原因

在整理数据持久层的异常规范时,对异常java.sql.SQLSyntaxErrorException进行捕获发现使用其父类java.sql.SQLException无法实现,若使用java.sql.Exception进行捕获可以实现但异常定位将不准确,后经过了解发现Spring只支持抛出org.springframework.dao.DataAccessException异常,该异常与实际异常java.sql.SQLSyntaxErrorException父类不相同,因此无法捕获;

解析异常

************

演示类:SQLSyntaxErrorException

访问修饰:public

完整名称:java.sql.SQLSyntaxErrorException

************

演示类的父类:SQLNonTransientException

访问修饰:public

完整名称:java.sql.SQLNonTransientException

************

演示类的父类的父类:SQLException

访问修饰:public

完整名称:java.sql.SQLException

************

演示类的父类的父类的接口:Iterable

访问修饰:public abstract interface

完整名称:java.lang.Iterable

************

演示类的父类的父类的父类:Exception

访问修饰:public

完整名称:java.lang.Exception

************

演示类的父类的父类的父类的父类:Throwable

访问修饰:public

完整名称:java.lang.Throwable

************

演示类的父类的父类的父类的父类的接口:Serializable

访问修饰:public abstract interface

完整名称:java.io.Serializable

************

演示类的父类的父类的父类的父类的父类:Object

访问修饰:public

完整名称:java.lang.Object

************

演示类:DataAccessException

访问修饰:public abstract

完整名称:org.springframework.dao.DataAccessException

************

演示类的父类:NestedRuntimeException

访问修饰:public abstract

完整名称:org.springframework.core.NestedRuntimeException

************

演示类的父类的父类:RuntimeException

访问修饰:public

完整名称:java.lang.RuntimeException

************

演示类的父类的父类的父类:Exception

访问修饰:public

完整名称:java.lang.Exception

************

演示类的父类的父类的父类的父类:Throwable

访问修饰:public

完整名称:java.lang.Throwable

************

演示类的父类的父类的父类的父类的接口:Serializable

访问修饰:public abstract interface

完整名称:java.io.Serializable

************

演示类的父类的父类的父类的父类的父类:Object

访问修饰:public

完整名称:java.lang.Object

实现

Mapper

List search(String str) throws DataAccessException;

Service

// 我是直接在Service处理异常(也可直接抛出不在此处理),处理方式是抛出新的异常(注释处),细节已省略;

public List search(String str) /*throws ServiceException*/ {

try {

return mapper.search(str);

} catch (DataAccessException e) {

// 处理异常

...

//throw new ServiceException(e.getMessage(), e);

}

}

最后

一个异常的抛出并不一定以其本身或超类的形式传递,因此要捕获该异常不可绝对的认为用其本身或超类可以捕获,也不可笼统的使用java.lang.Exception,追根溯源,找到其准确的传递形式才能正确的捕获并定位该异常;

Java MyBatis中,处理SQL查询超时通常涉及到两个方面:数据库连接池配置和事务管理。如果你遇到超时,可能会抛出`org.apache.commons.dbcp.SQLTimeoutException`或`com.mysql.cj.jdbc.exceptions.CommunicationsException`等异常。 1. **数据库连接池配置**: 如果你的应用使用了如Apache Commons DBCP、HikariCP或Druid等连接池,可以在配置文件中设置`maxWait`属性来控制最大等待时间,超过这个时间如果没有获取到连接,则会抛出超时异常。 ```xml <!-- HikariCP示例 --> <property name="hibernate.connection.provider_class" value="org.hibernate.service.jdbc.connections.HikariConnectionProvider"> <property name="hikari.maximumPoolSize">50</property> <property name="hikari.idleTimeout">60000</property> <!-- 这里可以设置超时毫秒数 --> <property name="hikari.timeout">30000</property> <!-- 查询超时时间 --> </property> ``` 2. **事务管理**: 在Spring框架中,你可以通过配置事务管理器来设置全局事务超时,例如在`@Transactional`注解中设置`timeout`属性: ```java @Service @Transactional(timeout = 30, rollbackFor = Exception.class) public class SomeService { //... } ``` 这里的30秒就是事务的超时时间,如果超过这个时间还没有完成事务,就会抛出超时异常。 3. **自定义异常处理**: 当然,你也可以选择在MyBatis的mapper接口方法上添加try-catch块来捕获并处理超时异常: ```java @Mapper public interface YourMapper { @Select("SELECT * FROM your_table") List<YourEntity> selectData(@Param("timeout") int timeout); default void selectWithTimeout() throws SQLException { try { List<YourEntity> data = selectData(30); // 设置超时时间为30秒 //... } catch (SqlTimeoutException e) { log.error("查询超时", e); throw new CustomTimeoutException("SQL查询超时"); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值