Node环境下MariaDB 10.3.13执行batch批量插入报ER_UNKNOWN_STMT_HANDLER错误
ER_UNKNOWN_STMT_HANDLER错误原因及batch方法批量插入解决方案
错误原因
- 你使用的MariaDB 10.3.13版本存在预处理语句handler异常回收的已知bug,服务端会提前释放驱动生成的预处理语句句柄,导致批量执行时找不到对应handler报出该错误
- 若你使用的Node.js mariadb驱动版本为3.x以上,该版本移除了对10.3早期版本的兼容逻辑,batch方法的预处理复用逻辑和服务端不匹配,也会触发该报错
修复方案
方案1:调整依赖版本(无业务代码改动)
你可以二选一操作:
- 升级MariaDB到10.3.34及以上稳定版本,该版本已修复预处理语句handler的异常回收问题
- 将Node.js的mariadb驱动降级到2.5.4版本,该版本自带对MariaDB 10.3早期版本的batch兼容逻辑
调整后你原有代码可直接正常运行。
方案2:修改连接配置(不改动现有依赖版本)
在创建数据库连接时添加prepareCacheLength: 0参数,关闭预处理语句缓存,强制每次batch执行时重新生成合法的预处理句柄,示例代码:
const mariadb = require('mariadb'); const conn = await mariadb.createConnection({ host: '你的数据库地址', user: '你的数据库账号', password: '你的数据库密码', database: 'a11yUIDB', // 添加以下配置即可解决报错 prepareCacheLength: 0 }); // 原有batch代码无需修改 result = await conn.batch("INSERT INTO `a11yUIDB`.`TEST_questions` (`name`,`address`,`text`,`match`,`type`) VALUES (?,?,?,?,?)", [[ 'Four', 'add one', 'te `', 'Yes', 'No' ],[ 'Five', 'add one', 'te `', 'No', 'No' ]]);
方案3:手动构造批量插入语句(兼容所有版本)
如果你不想调整依赖和配置,也可以手动构造多值插入语句用query方法执行,执行效率和batch方法基本一致:
const insertParams = [[ 'Four', 'add one', 'te `', 'Yes', 'No' ],[ 'Five', 'add one', 'te `', 'No', 'No' ]]; const insertSql = "INSERT INTO `a11yUIDB`.`TEST_questions` (`name`,`address`,`text`,`match`,`type`) VALUES ?"; const result = await conn.query(insertSql, [insertParams]);
内容的提问来源于stack exchange,提问作者PrivatMamtora
相关产品推荐
相关产品推荐

