达梦(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 删除。