繁体   English   中英

Node.js Oracle 数据库连接池大小

[英]Node.js Oracle Database Connection Pool Size

我用 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)还是默认设置就足够了?

预先感谢。

当您执行类似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 Parallelism and Connection Pool Sizing

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

旁注: process.env.UV_THREADPOOL_SIZE对 Windows 的 Node.js 没有影响; UV_THREADPOOL_SIZE变量必须在 Node.js 启动之前设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM