【问题标题】:Nodejs Knex -oracle concurrent call - table is lockedNodejs Knex -oracle 并发调用 - 表被锁定
【发布时间】:2020-10-21 16:07:50
【问题描述】:

我使用 Knex npm 作为我的查询构建器。版本 0.20.11。 节点版本为 12.16.1

池大小

最小 -3 最大 -500

我的服务是做一些长时间运行的过程,插入和更新超过 2 个表最终提交事务。

我给我的服务超过 150 到 200 个并发呼叫。 表被锁定。服务被挂起。表被锁定后甚至无法提供单个线程。

我正在使用 knex.transaction,我在服务结束后提交并销毁了我的连接。

如果有人遇到这种问题,请建议我如何解决这个问题。

注意:在最小线程数下工作正常

【问题讨论】:

    标签: node.js oracle knex.js


    【解决方案1】:

    如果您增加了连接池大小,则增加UV_THREADPOOL_SIZE,请参阅node-oracledb 文档Connections, Threads, and Parallelism。如图所示,确保在 Node.js 线程池启动之前进行设置。在 Windows 上,它必须在 Node.js 本身执行之前设置。所以最好的方法是将值设置为环境变量。例如,在 Linux 上,您的 package.json 可能有如下脚本:

    "scripts": {
        "start": "export UV_THREADPOOL_SIZE=10 && node index.js"
      },
    . . .
    

    或者,在 Windows 上:

    "scripts": {
        "start": "SET UV_THREADPOOL_SIZE=10 && node index.js"
      },
    . . .
    

    Knex 当前尝试在内部设置该值:这似乎为时已晚,而且在 Windows 上也不起作用。

    还要确保在使用后关闭连接,包括错误例程在内的所有地方。

    【讨论】:

    • 感谢您的回答。但我有同样的错误。什么是最大 UV_THREADPOOL_SIZE 值..
    • 在knex npm oracle dialect里面有代码自动增加UV_THREADPOOL_SIZE。
    • 使用 jmeter 我给我们的一个 api 提供了 100 个并发线程,它将在表中插入一条记录。在 oracle 中创建了 100 个会话(4 个活动和 96 个不活动)。但什么也没有发生。线程只是在等待。我仍然不知道如何克服这种情况。
    • 我会怀疑代码中的任何设置。除非在线程池启动之前设置了UV_THREADPOOL_SIZE ,否则仍将使用默认大小4。这意味着它确实需要成为代码库中的第一件事。在 Windows 上运行时在 Node.js 应用程序中设置 process.env.UV_THREADPOOL_SIZE 也会被忽略。您看到 4 个活动会话的事实是一个非常有力的线索。因此,请尝试在启动应用程序之前设置环境变量,例如在您的 package.json 中。请参阅 node-oracledb 文档oracle.github.io/node-oracledb/doc/api.html#numberofthreads
    • 我在 Knex 上记录了这个:github.com/knex/knex/issues/4076
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2015-05-09
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多