定时执行MySQL查询偶发ExecutorException及数组越界问题求助
解决MyBatis偶发ExecutorException(ArrayIndexOutOfBoundsException)问题
报错信息
org.apache.ibatis.executor.ExecutorException: 准备语句时出错。原因:java.lang.ArrayIndexOutOfBoundsException
业务场景
定时任务每30秒执行MySQL查询操作,偶发上述异常。
排查与解决方案
升级MyBatis至稳定版本
部分旧版MyBatis(如3.4.x及更早)在预编译语句管理、连接池交互的底层逻辑中存在数组越界的bug,建议直接升级到3.5.10及以上的稳定版本,官方已修复这类执行器层面的异常。优化数据库连接池配置
频繁的定时任务连接操作可能触发连接池的无效连接问题,导致语句准备失败:- 开启连接池的
testOnBorrow配置,用SELECT 1校验连接有效性,避免拿到失效连接 - 调整
maxActive、maxIdle参数,匹配业务并发量,防止连接耗尽或闲置过久 - 配置
removeAbandonedTimeout,自动清理超时未释放的连接
- 开启连接池的
校验动态SQL与参数合法性
若SQL包含动态拼接逻辑(如<foreach>循环),当参数集合为空或长度异常时,可能触发底层解析的数组越界:- 在Service层提前对参数集合做判空校验,避免空集合传入Mapper
- 检查动态SQL的边界逻辑,确保循环、条件分支的参数长度符合预期
确保SQLSession的线程安全性
定时任务若复用单例SQLSession,多线程并发会导致内部状态混乱:- 每次任务执行时,从
SqlSessionFactory.openSession()获取独立的SQLSession实例,执行完成后调用close()关闭。
- 每次任务执行时,从
内容的提问来源于stack exchange,提问作者study
相关产品推荐
相关产品推荐

