【问题标题】:Node.js Oracle Database Connection Pool SizeNode.js Oracle 数据库连接池大小
【发布时间】:2021-01-25 03:25:01
【问题描述】:

我使用 node-oracledb 实现了一个连接池 (poolMin=poolMax=10),我看到了高达 100 倍的差异,尤其是在像 10 个这样的少数用户的情况下。真的令人印象深刻。我还增加了 UV_THREADPOOL_SIZE,比如 4 + poolMax。在这一点上,我无法理解一些事情。

process.env.UV_THREADPOOL_SIZE = 4 + config.pool.poolMax // Default + Max

NodeJs 作为单线程工作(另外还有 4 个线程,它们都不用于网络 I/O)。那么当我使用一个有 10 个连接的池时,单线程可以使用所有这些连接吗?或者不再是具有这些设置的单线程?因为我在 UV_THREADPOOL_SIZE 中增加了 10 个。我将感谢任何解释此问题的人。

顺便说一句,我想知道使用像 10 这样的固定数字池是否会在用户过多的情况下导致问题?例如,如果即时用户的数量是 500,我们可以在一年中的某些日子达到 5000 即时用户。那些日子我需要进行特殊设置(例如池大小 100)还是默认设置就足够了?

提前感谢。

【问题讨论】:

    标签: node.js oracle connection-pooling node-oracledb fastify


    【解决方案1】:

    当您执行connection.execute() 之类的操作时,该工作将由 Node.js 工作线程处理,直到调用完成。每个底层 Oracle 连接一次只能做一件事(例如执行或获取 LOB 数据)——这是 Oracle 连接的基本(即不可克服的)行为。

    对于 node-oracledb,您希望工作线程的数量至少与连接池中的连接数量一样大,再加上一些额外的非数据库工作。这允许连接在不阻塞任何其他连接的情况下做自己的事情。

    任何使用单个连接的Promise.all()(和类似结构)都应该被评估并考虑重写为一个简单的循环。在 node-oracledb 5.2 之前,单个连接上Promise.all() 的每个“并行”操作都将使用一个线程,但这将被阻塞,等待连接上的先前工作完成,因此您可能需要更多可用线程。从 5.2 开始,单个连接上的任何“并行”操作都将在 node-oracledb 的 JavaScript 层中排队并按顺序执行,因此每个连接最多只需要一个工作线程。在任一版本中,使用 Promise.all() 的每个工作单元都有自己的连接是不同的,并且仅受每个线程一个连接的要求。

    查看 node-oracledb 文档 Connections, Threads, and ParallelismConnection Pool Sizing

    与如何使用连接不同,首先您必须获得连接。如果池中的每个连接都已在使用中,Node-oracledb 将对连接池请求(例如pool.getConnection())进行排队。这在连接尖峰下提供了一些弹性。帮助真正的风暴有一些限制:queueMaxqueueTimeout。是的,在高峰期您​​可能需要增加poolMax 的值。您可以查看pool statistics 以查看池行为。您不想让池太大 - 请参阅文档。

    旁注:process.env.UV_THREADPOOL_SIZE 在 Windows 上的 Node.js 中不起作用; UV_THREADPOOL_SIZE 变量必须在 Node.js 启动之前设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 2014-12-20
      • 1970-01-01
      • 2019-08-29
      • 2023-04-03
      • 2020-12-29
      • 1970-01-01
      相关资源
      最近更新 更多