【问题标题】:SESSIONS_PER_USER limit with nodejsnodejs 的 SESSIONS_PER_USER 限制
【发布时间】:2018-03-16 02:28:58
【问题描述】:

我已经为这个问题苦苦挣扎了几个星期:

由于某种原因,我们连接到另一台机器上的 oracle 数据库的 nodejs 脚本开始出现 SESSIONS_PER_USER 限制错误,但我们没有打开任何其他与数据库的连接。我尝试了我们拥有的另一个用户,但它返回完全相同的错误。

最奇怪的是,这个服务已经运行了好几个星期了,这是它第一次给我们这个错误。

我们使用 oracledb (https://github.com/oracle/node-oracledb) 模块连接数据库。

我们询问了支持团队,但显然他们可以使用我们的用户连接数据库,但是当涉及到使用我们机器(ubuntu 服务器 14.04)中的帐户时,会出现此错误。我尝试在我们的机器内搜索可能的“缓存”会话或连接,但我在谷歌上没有找到很多关于这个问题的帮助......

如果有人能就这个问题给我一些帮助,我将不胜感激,因为我不知道我还能做些什么。

提前致谢。

【问题讨论】:

  • 您的会话限制是多少?我不确定那个特定的提供者,但根据我过去的经验,提供者会在您连接时打开几个会话并将它们存储在连接池中以供重复使用。节点可能也在做同样的事情。
  • 它是 2,系统管理员刚刚告诉我,它停止工作的那一天,他们从“无限”更改为 2,但无论如何现在它不应该给出任何 session_limit 错误,因为我们没有任何连接。
  • 除非节点将一些数据存储在本地缓存中......但我还没有找到任何相关信息。我现在一无所知:S
  • 尝试将会话大小增加到 15。同样,我不确定 Node,但在 ASP.NET 中,连接池默认为 10。
  • 出于安全原因,他们不会这样做,还有很多其他用户正在访问这个数据库,并希望阻止我们打开多个连接...

标签: node.js oracle ubuntu-14.04 node-oracledb


【解决方案1】:
对于 any 配置文件,

2 的 SESSIONS_PER_USER 值低得离谱。为您的应用程序配置文件将其重新设置为 UNLIMITED。

应用程序或用户需要多个连接的正当理由有很多:

  1. 后台会话 - 许多工具和应用程序会自动创建一个或多个后台会话。这可能允许您的 IDE 运行并发语句,或者可能用于在您打开窗口时异步检索元数据。
  2. 调试 - Oracle 在调试时自动创建后台会话。
  3. 并行性 - 并行语句可以轻松产生数十或数百个会话。
  4. Sniped 连接 - 如果您的数据库设置了非活动超时,一些会话将被终止但不会立即删除。它们有时会在GV$SESSION 中显示为“被狙击”,除非重新启动数据库或等待,否则无法摆脱它们。即使客户端没有任何连接,这些会话仍会计入您的限制。
  5. 连接池 - 我不熟悉您的应用程序设置,但我认为现在大多数应用程序都会自动创建多个连接。
  6. 日常使用 - 很多人经常同时使用不同的工具连接到数据库,或者使用一个打开多个窗口的工具。

如果有人说“但我们的安全规则!”,请他们阅读DoD Security Technical Implementation Guide (STIG)。几乎可以肯定,他们的规则或某些安全审计的结果是基于该文件。没有什么可以反对拥有大量或无限数量的并发会话。你只需要在你的网站特定规则中证明它是合理的。


对于防止不必要的调用或防止大量打开的连接,2 也是一个低得离谱的值。

很难预测不同的程序在达到该限制时会如何中断。找不到活动会话也就不足为奇了——也许程序会尝试自动生成 X 线程并在其中一些失败时立即将它们全部杀死。

请您的管理员准确地解释他们要完成的工作以及原因。

我的猜测是数据库配置错误,存在任意稀缺资源。例如,参数 PROCESSES 和 SESSIONS 通常默认为低值。如果这些值保持在一个很小的值,比如 100,那么就会出现问题,用户必须争夺连接。

减少数据库中的会话数会很有帮助。但是限制为 2 是不现实的。我见过大量数据库在旧硬件上运行,有数千个会话。

【讨论】:

  • 我完全同意你的观点,但显然他们这样做是因为公司周围的许多用户都需要访问这个数据库(生产)并且不希望通过不必要的调用使其过载。在这种情况下,它是一个每天运行一次的 cron 作业。最奇怪的是,当他们为我同事的用户和我的用户寻找打开的连接时,没有任何活动!
【解决方案2】:

我自己继续回答这个问题,因为发生的事情是 IT 团队在我们开始遇到问题的确切那天更改了一些配置...用户配置从 UNLIMITED 请求到 2。碰巧在我们的代码中我们使用了称为 eachLimit 的异步(nodejs)方法,您可以在其中分配限制迭代计数,它是 2,但无论如何都会使其崩溃(即使限制为 2)。

解决方案:移除迭代器并手动 1 逐 1(只有 4 个元素)进行,无论如何它仍然很苛刻,因为我们每天都必须执行此任务。

感谢你们的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2018-06-19
    • 1970-01-01
    • 2020-08-06
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多