首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >达梦(DM)JDBC 驱动的 DmdbClob.getAsciiStream().read() 存在 bug,读取 CLOB 列数据时永久堵塞

达梦(DM)JDBC 驱动的 DmdbClob.getAsciiStream().read() 存在 bug,读取 CLOB 列数据时永久堵塞

原创
作者头像
用户12110064
发布2026-08-12 20:09:37
发布2026-08-12 20:09:37
840
举报

达梦(DM)JDBC 驱动的 DmdbClob.getAsciiStream().read() 存在 bug,读取 CLOB 列数据时永久阻塞,导致 chunjun 的 DmSyncConverter 在把 CLOB 转 String 时卡死(CPU 100%),任务永不结束

证据链:

3 个卡住任务(*******、****、****)进程 CPU 100% 跑 70-85 分钟

线程 dump 显示卡在 DmSyncConverter.lambda$9 → StringUtil.inputStream2String → InputStream.read()

源表确认:**** 有 21 个 CLOB 列(FINANCIAL_CONDITION 等),数据返回类型是 DmdbNClob

最小复现:getAsciiStream().read() 对 5 行数据永久阻塞(40s 超时被杀);而 getCharacterStream() / getSubString() 正常

影响面:达梦库有大量含 CLOB 的表(40+),所有接入都会卡死;节点 均受影响(与 worker 节点无关)

✅ 解决方案(已执行)

用 javassist patch chunjun 的 DmSyncConverter,把 CLOB 列读取方式从 getAsciiStream()(卡死)改为 getSubString(1, length)(正常):

步骤 内容

1 下载 javassist 3.29.2

2 重写 DmSyncConverter.lambda$createInternalConverter$cdd9fd22$9 的 CLOB 分支:clob.length() + clob.getSubString(1, (int)len)

3 备份原 jar(.bak_clobfix)并写回 patch 后 jar

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档