Tomcat连接池间歇性抛出Unexpected end of data异常求助
问题描述
Spring Boot应用配置了Tomcat连接池,application.properties配置如下:
// db user name, password, url here... spring.datasource.tomcat.initial-size=15 spring.datasource.tomcat.max-wait=20000 spring.datasource.tomcat.max-active=100 spring.datasource.tomcat.max-idle=15 spring.datasource.tomcat.min-idle=8 spring.datasource.tomcat.default-auto-commit=true spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
初始运行正常,但每隔数小时执行JDBC代码时会抛出Unexpected end of data异常,部分场景表现为SQLException。重启Tomcat后恢复正常,但一段时间后问题复现。
连接代码采用try-with-resources语法:
try ( final Connection connection = dataSource.getConnection(); final PreparedStatement statement = connection.prepareStatement(SQL_TO_RUN_HERE); ) { // 业务逻辑代码 }
其中dataSource为注入的连接池实例。不使用连接池,直接调用DriverManager.getConnection(...)则无此问题。
补充错误细节:
- SQL状态码:08007
- 详细信息:
[FileMaker][FileMaker JDBC] Unexpected end of data. - 错误码:27026
- 报错行:
connection.prepareStatement(SQL)
问题分析与解决方案
问题核心是连接池中的连接已被FileMaker服务器主动断开,但Tomcat连接池未检测到连接失效,仍将无效连接分配给应用使用。直接用DriverManager每次新建连接,因此不会出现该问题。
需给Tomcat连接池添加连接有效性检测配置,确保分配的连接均可用:
在application.properties中追加以下配置:
# 用于检测连接有效性的SQL(需替换为FileMaker支持的简单查询,比如查询任意存在的表) spring.datasource.tomcat.validation-query=SELECT 1 FROM your_existing_table # 获取连接时检测有效性 spring.datasource.tomcat.test-on-borrow=true # 归还连接时不检测(可根据需求调整) spring.datasource.tomcat.test-on-return=false # 连接空闲时定时检测有效性 spring.datasource.tomcat.test-while-idle=true # 空闲检测的间隔时间(单位:毫秒,此处为5分钟) spring.datasource.tomcat.time-between-eviction-runs-millis=300000 # 连接空闲超过该时长后被纳入检测范围(单位:毫秒,此处为30分钟) spring.datasource.tomcat.min-evictable-idle-time-millis=1800000
配置说明:
validation-query:必须是FileMaker支持的合法SQL,比如查询一张存在的表的简单语句,用于验证连接是否存活。test-on-borrow:获取连接前强制检测,确保拿到的是可用连接,能直接解决当前问题,仅会带来微小性能损耗。test-while-idle+配套参数:定时清理池中失效连接,提前淘汰即将被服务器断开的空闲连接,避免后续分配无效连接。
另外建议检查FileMaker服务器的连接超时设置,确保连接池的min-evictable-idle-time-millis小于服务器端的连接超时时间,避免服务器先断开连接但连接池未及时清理的情况。
内容的提问来源于stack exchange,提问作者Morkus
相关产品推荐
相关产品推荐

