首页 > 解决方案 > Knex.js 强制会话重用 4 个以下查询

问题描述

我有一个子查询在四个不同的查询中使用,所有这些查询都执行以呈现一些类似仪表板的功能。所有查询的共同点是我想在临时表中提取的这个子查询。这是成功的,但是使用 Knex.js(这太棒了)连接是池化的,这意味着所有查询都使用不同的连接,这再次导致临时表被丢弃在两者之间。

有没有办法以这种方式强制使用一个连接和 Knex 中的一个会话?还是我需要寻找其他解决方法,例如将其全部包装在事务中?

标签: node.jspostgresqldatabase-connectionconnection-poolingknex.js

解决方案


基本上,您只能通过在同一事务中运行这些查询来做到这一点。这迫使 knex 对所有查询使用相同的连接。

另一种方法是手动从池中获取连接,knex.client.aqcuireConnection()并用于knex.connection(connection)在该单个连接中运行查询。最后,您需要将连接释放回池中,以免泄漏与knex.client.releaseConnection(connection).

就像是:

let connection = await knex.client.acquireConnection();
try {
    const res = await knex('table').connection(connection).where('id',1);
    const res2 = await knex('table2').connection(connection).where('id',1);
} finally {
    knex.client.releaseConnection(connection);
}

推荐阅读