【DM版本】:
DM Database Server 64 V8
DB Version: 0x7000d
03134284604-20260707-335949-20228
Msg Version: 6
Gsu level(5) cnt: 102
【操作系统】:win11
【CPU】: AMD5600X
【问题描述】*:
业务需要用nodejs连接数据库。
我用的驱动版本是npmjs上的当前最新1.0.52452版。
以前调试时用过版本1.0.19862不会报连接池别名的错,但是用这版连接现在的数据库会报加密问题出错。
3.参考社区中查询应用维护的连接池的办法
https://eco.dameng.com/community/question/abd9326d0e488e7ced464dc522fefd45,结果如下,并框出来了22:40:40秒前后查询且应用端报错时的数据库连接池情况:
/dmdb/src/dm.js文件下
5.我该怎么做,或者有什么办法解决,谢谢

问题定位到了:连接池默认别名是
default,同名就不能再建,第二次createPool必然报 20006。这个行为是 v1.0.48286 引入的(该版本 changelog 原文):
您从 1.0.19862 升到 1.0.52452,正好跨过了这个变更点。
为什么"指定别名依然报错"
如果每次都传同一个
poolAlias,效果和用默认别名一样——第二次还是冲突。别名要每个池唯一,或者用完close()释放。实测(1.0.52452 + DM8):
指定同一个别名
mypool时,也是第 2 次就报错。三种解法(均已实测)
方案一:复用已有池(推荐)
一个池对应一个别名,不要重复创建,用
getPool取回:await dmdb.createPool({ connectString: 'dm://SYSDBA:pwd@127.0.0.1:5236' }); // 后续所有地方 const pool = dmdb.getPool('default'); const conn = await pool.getConnection(); // ...用完 conn.close()实测连续 3 次取连接查询均正常,拿到的始终是同一个池。
方案二:每个池用唯一别名
const alias = 'user_' + userId + '_' + Date.now(); const pool = await dmdb.createPool({ connectString: 'dm://SYSDBA:pwd@127.0.0.1:5236', poolAlias: alias }); // 不再需要时 await pool.close(); // close 会自动从 dmdb.pools 移除该别名方案三:close 后可重用同名
const p = await dmdb.createPool({ connectString: cs, poolAlias: 'reuse' }); await p.close(); // 别名被释放 // 下一轮可以再用 'reuse'实测连续 3 轮 create+close 均成功。
另外两点
1) createPool 的连接串必须带用户名密码
PoolAttributes.connectString的格式是dm://user:pass@host:port,不是host:port。写成
dm://127.0.0.1:5236且另传user/password字段是无效的,会表现成连不上([20017] 获取连接请求等待超时)。(
getConnection则是另一种格式:{ connectString: 'host:port', user, password }。)2) 池不要每次请求都建
按您"多用户、多池"的场景,建议在应用启动时按租户/数据源建好池并缓存引用,请求里只
getConnection();如果确实要动态建,务必在
finally里await pool.close(),否则别名会一直被占用。关于您提到的数据库连接池视图,那个查看的是 DB 侧的会话/连接情况;20006 是驱动内存里的别名冲突,两者不是一回事,所以从 DB 视图看不出异常。