HikariCP连接池异常尝试连接废弃数据库URL问题排查咨询
HikariCP在OSGi(Fuse 7.3)环境下连接旧数据库URL的问题分析
问题背景
通过HikariConfig Bean配置HikariDataSource,基于Fuse 7.3(OSGi)环境运行多年,近期日志出现连接已弃用的旧数据库URL的错误,但代码和OSGi配置中均无该旧URL的痕迹,怀疑连接池旧信息被磁盘持久化,但不确定原因。
错误堆栈(中文翻译)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 连接到主机qa01上的命名实例authdb失败。错误:"java.net.SocketTimeoutException: Receive timed out"。请验证服务器和实例名称,并检查是否有防火墙阻止了端口1434的UDP流量。对于SQL Server 2005及更高版本,请验证主机上的SQL Server Browser服务是否正在运行。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:206) at com.microsoft.sqlserver.jdbc.SQLServerConnection.getInstancePort(SQLServerConnection.java:5294) at com.microsoft.sqlserver.jdbc.SQLServerConnection.primaryPermissionCheck(SQLServerConnection.java:1859) at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1596) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1447) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:788) at com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnectionInternal(SQLServerDataSource.java:719) at com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnection(SQLServerDataSource.java:71) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:341) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:193) at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:428) at com.zaxxer.hikari.pool.HikariPool.access$300(HikariPool.java:70) at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:612) at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:598) at java.util.concurrent.FutureTask.run(FutureTask.java:266)
可能原因分析
- OSGi配置缓存遗留:Fuse的OSGi容器会缓存配置信息,即使修改了配置,
ConfigAdmin服务的快照、bundle配置缓存文件可能未被清理,重启时加载旧配置。检查Fuse的data/config、etc目录下是否有包含旧URL的残留配置文件。 - 连接池未完全重建:如果之前连接池未被正确销毁(比如bundle热部署时未关闭连接池),重启后可能存在残留的连接池实例复用旧配置;若配置变更后仅扩容连接池而非完全重建,会继续用旧URL创建新连接。
- 配置注入未刷新:在OSGi环境中,若
HikariConfigBean为单例,配置更新后未触发Bean重新初始化,会继续使用旧配置实例。检查Blueprint/Spring DM的配置注入逻辑,确认配置变更时是否触发Bean刷新。 - JDBC驱动缓存:SQL Server JDBC驱动可能缓存实例解析信息,即使URL变更,仍尝试旧地址。可检查驱动版本是否存在此类缓存问题,或清理驱动缓存。
- 部署快照恢复:Fuse的自动备份部署快照可能在重启时恢复旧部署包,其中包含旧配置。检查部署目录下的bundle是否为最新版本,是否存在旧bundle残留。
排查建议
- 清理Fuse缓存:停止Fuse,删除
data/cache、data/tmp等缓存目录后重启。 - 全量检查配置源:除代码中的
HikariConfig,通过config:list命令查看OSGi ConfigAdmin配置,检查bundle的META-INF/spring、OSGI-INF/blueprint配置文件,确认无遗漏的旧URL。 - 强制重建连接池:配置变更后,确保
HikariDataSource被销毁并重新创建,bundle启动时显式关闭旧连接池再初始化新实例。 - 升级JDBC驱动:将SQL Server JDBC驱动升级至兼容Fuse 7.3的最新版本,避免驱动缓存问题。
内容的提问来源于stack exchange,提问作者djb
相关产品推荐
相关产品推荐

