knexjs承诺发布池连接

时间:2017-01-11 10:35:44

标签: mysql node.js promise connection-pooling knex.js

我目前使用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

有人可以向我解释一下发生了什么以及我如何解决这个问题?感谢。

2 个答案:

答案 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; 
});