【问题标题】:Can a third query execute in the middle of two queries inside the same db.any() call?第三个查询可以在同一个 db.any() 调用中的两个查询中间执行吗?
【发布时间】:2021-05-09 20:22:42
【问题描述】:

如果我有以下代码,在请求中间执行:

db.any('SET search_path TO user001; SELECT * FROM messages')

第二个请求能否在第一个查询的 SET 和 SELECT 之间执行查询? 例如:

  • 第一个请求到达
  • SET search_path TO user001(第一名)
  • 第二个请求到达
  • SET search_path TO user002(第二次)
  • SELECT * FROM messages(第一名)
  • SELECT * FROM messages(第二次)

还有什么是在运行时定义 search_path 的好方法?我想过使用 db.task() 但这会将每秒的请求数限制在 100 左右,对吧?

【问题讨论】:

  • 请澄清:a)“第二个请求”是指:对 postgresql 的任何其他查询?仅来自您的应用程序或连接到 PostgreSQL 实例的其他客户端?b)如果您仅指您的应用程序:做你打开多个并发会话到数据库服务器?
  • @AlexYu a) 由第二个 HTTP 请求生成的对 postgresql 的任何其他查询 b) 不,我正在使用相同的“db”对象进行查询

标签: javascript node.js postgresql pg-promise


【解决方案1】:

第二个请求能否在第一个查询的 SET 和 SELECT 之间执行查询?

不,这样的查询被当作一个查询来处理,这就是所谓的原子操作。

还有什么是在运行时定义 search_path 的好方法?

pg-promise 中,初始化选项schema 执行此操作。它会为每个新连接自动设置架构。

但是,如果您需要为每个请求不断更改当前架构,即如果您实际上为每个用户都有一个单独的数据库架构,那么它将无法工作,您将需要使用您尝试过的方法,即为每个查询添加模式更改查询。

然而,在处理一个请求时对每个查询执行此操作是没有意义的,您只需在开始处理请求时执行一次。这就是为什么自动任务/事务最适合它的原因。事实上,您可以使用事件extend 添加您自己的自定义任务/事务,以在开始时执行架构更改。

我曾想过使用 db.task() 但这会将每秒的请求数限制在 100 左右,对吧?

没有,你从哪里找到这些信息的? :) 任务不会添加任何此类限制。

【讨论】:

  • 我以为他们做到了,任务不是在回调退出之前保留连接吗?想象一下,我使用 AsyncLocalStorage 存储数据库上下文,并将其拉到我执行数据库操作的每个文件上,仅在将响应发送回用户时才释放它。在一切完成之前,这不会保持连接打开吗?看看 max_connections 如何默认为 100,我认为 100 个同时请求将使用池中的所有可用连接
  • 为什么要在任务完成之前释放连接?该任务代表您的请求处理程序,因此您使用连接直到完成,然后它将自动释放。
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 2020-03-09
  • 1970-01-01
  • 2011-08-13
  • 2016-08-02
  • 2022-06-11
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多