node-oracledb 连接池未将连接释放回数据库的问题

问题描述 投票:0回答:1

我们的 Oracle 数据库中的 PGA 内存正在稳步增加,我们正在尝试找出根本原因。我们怀疑应用程序中的连接池没有按预期将连接释放回数据库。以下是我们的配置详细信息以及我们面临的问题:

连接池配置:

  • poolMin
    :5
  • poolMax
    :10
  • poolIncrement
    :1
  • poolTimeout
    :10秒

问题描述: 流量高峰期,连接数从5(

poolMin
)增加到10(
poolMax
)。但是,当流量较低时,即使在不活动 10 秒 (
poolMin
) 后,连接也不会释放回 5 (
poolTimeout
)。

参考:根据node oracledb文档

If the application returns connections to the pool with connection.close(), and the connections are then unused for more than poolTimeout seconds, then any excess connections above poolMin will be closed. When using Oracle Client prior to version 21, this pool shrinkage is only initiated when the pool is accessed.

如果您需要我添加任何内容以提供更好的答案,请告诉我。

我尝试过的:

  1. 监控连接:使用
    pool.getStatistics()
     方法监控池中打开的、正在使用的和空闲的连接数。
  2. 流量模拟:使用k6脚本模拟流量,观察连接池在高流量和低流量期间的行为。
  3. 数据库查询:运行查询来监控 Oracle 数据库中的活动连接和会话 PGA 内存。

我的期望:

  1. 在高流量期间,我预计连接数会从 5 (
    poolMin
    ) 增加到 10 (
    poolMax
    )。
  2. 在流量较低期间,我预计连接数会在不活动 10 秒 (
    poolMin
    ) 后减少回 5 (
    poolTimeout
    )。
  3. 我预计会话 PGA 内存会随着空闲连接的终止而相应减少。

实际发生的事情:

  1. 在高流量期间,连接数如预期增加到10个。
  2. 在低流量期间,即使在不活动 10 秒后,连接数也不会减少回 5。虽然有时会一一减少,但不会一直回到5(
    poolMin
    值)
  3. 会话PGA内存确实有所减少,但很少有空闲连接没有被终止。

问题:当流量不多时,连接池没有释放空闲连接回poolMin,可能是什么原因?

node.js oracle-database connection-pooling node-oracledb node-oracle
1个回答
0
投票

正如 Slack 中所讨论的,您正在使用 Instant Client 19c 库的厚模式。

node-oracledb doc中涵盖了您的场景:

当使用Oracle Client 19或更早版本使用node-oracledb厚模式时,此池收缩仅在访问池时启动,因此完全空闲的应用程序中的池不会收缩。”

这是 Oracle 客户端库的最初设计。 直到 21c 才引入了一些线程并且可以发生后台关闭。

我们的性能团队非常强烈建议使用固定大小的池来避免数据库负载问题,因此动态池对于大多数人来说不应该成为问题。还要保持泳池尺寸较小。

如果您有一个非常具体的用例想要强制关闭连接,那么您可以使用以下方法将其从连接池中删除:

await connection.close({drop: true});

池将根据需要重新增长。

© www.soinside.com 2019 - 2024. All rights reserved.