Skip to content

fix: 连接池懒加载+有效性校验,驱动资源清理与友好错误提示#1

Merged
wl2027 merged 1 commit into
mainfrom
claude/charming-curie-RAp1f
Jun 5, 2026
Merged

fix: 连接池懒加载+有效性校验,驱动资源清理与友好错误提示#1
wl2027 merged 1 commit into
mainfrom
claude/charming-curie-RAp1f

Conversation

@wl2027
Copy link
Copy Markdown
Owner

@wl2027 wl2027 commented Jun 5, 2026

背景

针对 4ce8355 (chore: prepare 2.1.0 release) 引入的连接池 / 驱动加载逻辑做健壮性修复。逐条核对了 review 中提出的 5 个问题,均确认存在,本 PR 全部处理。

# 问题 结论 严重度
1 getOrCreateConnectionPool 一次性预建 10 个连接,任一失败抛 RuntimeException(首次查询即整体失败)。另外存在隐藏 bug:中途失败时已建连接泄漏、computeIfAbsent 未缓存导致每次重试都重开 10 个 确认
2 池化连接无失效检测(只 poll/offer),长时间空闲后可能 stale 确认
3 URLClassLoaderDriverShim 永不释放;且 closeAllConnections() 从未被调用,连接同样泄漏 确认
4 collectNamingNames 递归未判 child != null 确认
5 驱动未下载直接抛 IllegalStateException,提示不友好 确认

改动

QueryTool(问题 1、2) —— 连接池改为懒加载:

  • 连接按需创建(上限 MAX_CONNECTIONS=10),首次查询只建 1 个,不再一次性预建 10 个;
  • 取连接时用 Connection.isValid(2s) 校验,失效则关闭丢弃并重建,规避数据库侧断连后的 stale 连接;
  • 单连接创建失败只抛 SQLException不污染连接池且不泄漏(预占的 slot 会回退),下次查询可正常恢复;
  • 归还时检测是否已关闭,已关闭/池满则释放而非塞回。

DataSourceDriverUtil(问题 3、5):

  • 用 record 跟踪注册的 shimURLClassLoader,新增 deregisterAllDrivers(),dispose 时反注册并 close() 类加载器;
  • 驱动未下载(ClassNotFoundException / NoClassDefFoundError)时给出可操作的友好提示,引导用户先在 DataGrip 数据源里下载该驱动;其余失败走通用提示。

DataPivotInitializer(问题 3) —— 项目 dispose 时一并清理连接池与已注册驱动(此前 closeAllConnections 从未被注册,连接会一直泄漏)。

DataGripUtil(问题 4) —— collectNamingNames 递归补全 node / group / child / name 的 null 防御。

i18n —— 新增 data.pivot.driver.not.downloadeddata.pivot.driver.register.fail 的中英文文案(default / zh_CN / en_US)。

验证

由于本环境网络策略屏蔽了 JetBrains 仓库(download.jetbrains.com 返回 403),无法跑完整 Gradle 构建。连接池是最易出错的部分,因此用与补丁完全一致的方法体(仅把 createConnection 换成可控的 java.sql.Connection 动态代理)写了独立用例验证,18 项断言全部通过:

  • 懒加载:首次 acquire 只建 1 个(旧逻辑建 10);
  • stale(isValid=false)连接不下发、被关闭并重建,计数不漂移;
  • 归还时外部已关闭的连接被丢弃而非入池;
  • 容量上限封顶、超时返回 null(实测 ~5s);
  • 创建失败抛 SQLException 不泄漏 slot,且后续可恢复;
  • closeAll 正确清空并归零计数。

注:ensureDriverRegistered 的公开签名保持不变(仍含 dataSourceId 上下文参数),调用方无需改动。

https://claude.ai/code/session_01HYez8dwWXxDUsygNsoKWT9


Generated by Claude Code

针对 2.1.0 引入的连接池/驱动加载逻辑做健壮性修复:

- QueryTool: 连接池由「一次性预建 10 个连接」改为懒加载,按需创建(上限 10)。
  取连接时用 Connection.isValid() 校验,失效连接丢弃并按需重建,避免长时间空闲后
  使用到被数据库侧断开的 stale 连接。单个连接创建失败只抛 SQLException 且不污染
  连接池,不再首次查询即整体 RuntimeException;归还时校验是否已关闭。
- DataSourceDriverUtil: 跟踪注册的驱动 shim 与 URLClassLoader,新增
  deregisterAllDrivers() 在 dispose 时反注册并关闭类加载器,避免长期驻留;
  驱动未下载(ClassNotFound/NoClassDefFound)时给出可操作的友好提示,引导用户
  先在 DataGrip 数据源里下载该驱动。
- DataPivotInitializer: 项目 dispose 时一并清理连接池与已注册驱动
  (此前 closeAllConnections 从未被调用,连接会泄漏)。
- DataGripUtil: collectNamingNames 递归增加 node/group/child/name 的 null 防御。
- i18n: 新增驱动未下载、驱动注册失败的中英文提示文案。

https://claude.ai/code/session_01HYez8dwWXxDUsygNsoKWT9
@wl2027 wl2027 merged commit 4dda834 into main Jun 5, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants