Spring Boot连接Hana数据库容器启动时报SAP DBTech JDBC Object is closed错误
解决方案
以下是经过验证的可解决该问题的排查路径:
1. 校验JDBC驱动版本兼容性
SAP HANA JDBC驱动ngdbc的低版本存在已知的连接自动关闭bug,且必须和数据库服务端版本匹配:
- 若你的HANA数据库为2.0 SPS05及以上版本,需使用
ngdbc2.12.x及以上版本 - 检查项目依赖配置,示例如下:
<!-- Maven依赖示例 --> <dependency> <groupId>com.sap.cloud.db.jdbc</groupId> <artifactId>ngdbc</artifactId> <version>2.17.14</version> </dependency>
2. 开启数据源连接有效性校验
Spring Boot默认的Hikari连接池默认未开启空闲连接校验,会将HANA服务端已经主动断开的无效连接传递给Flyway,触发报错。新增如下配置:
spring: datasource: url: jdbc:sap://<你的HANA地址>:3<实例号>15/?currentschema=<你的schema> username: <用户名> password: <密码> driver-class-name: com.sap.db.jdbc.Driver hikari: # HANA专用的连接校验语句 connection-test-query: SELECT 1 FROM DUMMY # 每30秒校验一次空闲连接的有效性,需小于HANA服务端的空闲连接超时时间 keepalive-time: 30000 minimum-idle: 2 flyway: # 强制指定Flyway的数据库类型为HANA,避免自动探测失败 database: hana # 连接失败重试3次 connect-retries: 3
3. 调整HANA服务端空闲连接超时配置
CLI和数据库客户端属于短连接操作,不会触发空闲超时;而Flyway启动时需要先持有连接读取元数据,再执行迁移,空闲时间超过服务端阈值就会被主动断开。
使用管理员账号登录HANA执行如下语句查询当前超时配置:
SELECT VALUE FROM M_SYSTEM_OVERVIEW WHERE NAME = 'idle_connection_timeout';
若返回值低于30秒,可调整为60秒验证问题是否解决。
4. 排除Flyway版本兼容性问题
Spring Boot 3.x默认搭配的Flyway 9.x以上版本优化了专有数据库的适配逻辑,如果未显式指定数据库类型,Flyway会错误关闭探测失败的连接,在配置中显式指定spring.flyway.database: hana即可解决。
内容的提问来源于stack exchange,提问作者w31ex
相关产品推荐
相关产品推荐

