我们的 Oracle 数据库中的 PGA 内存正在稳步增加,我们正在尝试找出根本原因。我们怀疑应用程序中的连接池没有按预期将连接释放回数据库。以下是我们的配置详细信息以及我们面临的问题:
连接池配置:
poolMin
:5poolMax
:10poolIncrement
:1poolTimeout
: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.
如果您需要我添加任何内容以提供更好的答案,请告诉我。
我尝试过的:
pool.getStatistics()
方法监控池中打开的、正在使用的和空闲的连接数。我的期望:
poolMin
) 增加到 10 (poolMax
)。poolMin
) 后减少回 5 (poolTimeout
)。实际发生的事情:
poolMin
值)问题:当流量不多时,连接池没有释放空闲连接回poolMin,可能是什么原因?
正如 Slack 中所讨论的,您正在使用 Instant Client 19c 库的厚模式。
node-oracledb doc中涵盖了您的场景:
当使用Oracle Client 19或更早版本使用node-oracledb厚模式时,此池收缩仅在访问池时启动,因此完全空闲的应用程序中的池不会收缩。”
这是 Oracle 客户端库的最初设计。 直到 21c 才引入了一些线程并且可以发生后台关闭。
我们的性能团队非常强烈建议使用固定大小的池来避免数据库负载问题,因此动态池对于大多数人来说不应该成为问题。还要保持泳池尺寸较小。
如果您有一个非常具体的用例想要强制关闭连接,那么您可以使用以下方法将其从连接池中删除:
await connection.close({drop: true});
池将根据需要重新增长。