【问题标题】:Can I use one connection to postgresql and use it to make concurrent queries?我可以使用一个到 postgresql 的连接并使用它来进行并发查询吗?
【发布时间】:2021-10-03 08:46:33
【问题描述】:

我用knex在nodejs中写,我想更新db中的多行,我想知道我是否可以并行执行多个更新查询,

像这样:

const updatesPromises = books.map((book) =>
    transaction('books')
      .where({ id: book.id })
      .update({ title: book.name }, ['id', 'title'])    

await Promise.all(updatesPromises)

而是同步执行每个更新查询,如下所示:

books.forEach(async (book) =>
    await transaction('books')
      .where({ id: 42 })
      .update({ title: "The Hitchhiker's Guide to the Galaxy" }, ['id', 'title'])
  • transaction 是我之前创建的连接,在所有更新后提交

这是最佳做法吗?

会造成大规模的问题吗?

【问题讨论】:

  • Nodejs 这里没有使用多线程。
  • I/O 并行发生

标签: node.js typescript postgresql multithreading knex.js


【解决方案1】:

我想知道我是否可以并行执行多个更新查询

没有。单个连接仅支持查询的顺序执行。 node-postgres 不会阻止您一次发出多个调用,但它会在内部对它们进行排队,因此您不会从一次创建所有 Promise 并在它们上调用 Promise.all 获得任何好处。

(也就是说,我不知道 Knex transaction 是如何工作的,如果它使用 connection pool 它实际上可能不会将您限制为单个连接。但是,如果您服务多个 HTTP 客户端,您应该只使用每个 HTTP 请求的连接。)

【讨论】:

    【解决方案2】:

    由于您使用的是事务,因此最好的做法是一个接一个地依次执行。

    在您的情况下,错误处理也非常讨厌,如果其中一个查询失败,但Promise.all() 可能会继续向已经回滚的事务发送查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 2012-10-07
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多