我目前使用knexjs.org,承诺而不是常规回调,并使用池连接进行SQL查询。它第一次运行顺利。但现在我通常面临池连接错误。像这样的代码
ImageList
但现在我通常会在其中获得错误连接超时和错误池连接。它导致错误的第一件事可能是因为我没有释放连接,但我有这样的代码,
knex('user_detail')
.select('id','full_name','phone','email')
.where('id', id_user)
.then((result) => {
resolve(result);
})
.catch((error) => {
reject(error);
})
它适用于第一次尝试,但在第二次尝试失败并收到错误knex('user_detail')
.select('id','full_name','phone','email')
.where('id', id_user)
.then((result) => {
resolve(result);
})
.catch((error) => {
reject(error);
})
.finally(() => {
knex.destroy()
})
,有时错误There is no pool defined on the current client
有人可以向我解释一下发生了什么以及我如何解决这个问题?感谢。
答案 0 :(得分:1)
没有足够的信息可以告诉您为什么首先用尽了池连接。
您调用某些resolve()
和reject()
函数的方式预示着您使用的承诺效率低下或完全错误...
如果您添加完整的代码示例,您如何能够得到the pool is probably full
错误,我可以编辑答案并能够提供更多帮助。例如,通过意外创建多个未解决的事务,池将填满。
在第二个代码示例中,您调用的knex.destroy()
并不会破坏单个池连接,但会完全破坏knex
实例和您正在使用的池。
因此,在knex.destroy()
之后,您再也无法使用该knex
实例了,您必须通过再次提供数据库连接配置来创建全新的实例。
答案 1 :(得分:0)
这样你就不需要处理连接,它会自动提交+释放以在返回时池回并在抛出错误时回滚。
const resultsAfterTransactionIsComplete = await knex.transaction(async trx => {
const result = await trx('insert-table').insert(req.list).returning('*');
// insert logs in the same transaction
const logEntries = result.map(o=> ({event_id: 1, resource: o.id}));
await trx('log-table').insert(logEntries);
// returning from transaction handler automatically commits and frees connection back to the pool
return results;
});