SESSIONS_PER_USER限制与nodejs

我一直在这个问题上挣扎了几个星期:

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

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

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

我们询问了支持团队,但显然他们可以使用我们的用户连接数据库,但是当涉及到使用我们的机器(ubuntu服务器14.04)的帐户,它会给出这个错误。 我试图寻找一个可能的“caching”的会议或在我们的机器内部的连接,但我还没有find关于谷歌这件事的很多帮助…

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

提前致谢。

2对于任何configuration文件来说,SESSIONS_PER_USER的值都是很低的。 将其提升到无限的您的应用程序configuration文件。

为什么应用程序或用户需要多个连接有许多合法的原因:

  1. 后台会话 – 许多工具和应用程序会自动创build一个或多个后台会话。 这可能允许您的IDE运行并发语句,或者可能用于在打开窗口时asynchronous检索元数据。
  2. debugging – Oracle在debugging时自动创build后台会话。
  3. 并行性 – 并行语句可以很容易地产生几十或几百个会话。
  4. Sniped连接 – 如果您的数据库设置了非活动超时,某些会话将被杀死,但不会立即被删除。 他们有时在GV$SESSION显示为“sniped”,在重新启动数据库或等待的情况下无法摆脱它们。 即使客户端没有任何连接,这些会话仍然会违反您的限制。
  5. 连接池 – 我不熟悉你的应用程序设置,但我认为现在大多数应用程序自动创build多个连接。
  6. 日常使用 – 许多人经常使用不同的工具连接到数据库,或者使用一个工具打开多个窗口。

如果有人说“但我们的安全规则!”,请他们阅读国防部安全技术实施指南(STIG) 。 几乎可以肯定的是,他们的规则或一些安全审计的结果是基于该文件的。 有没有什么反对有一个巨大的或无限数量的并发会话。 您只需在您的站点特定规则中certificate它的正确性。


2对于防止不必要的呼叫或防止大量的开放连接也是一个可笑的低值。

很难预测不同的程序在达到这个限制时会如何破解。 你不能find活动的会话并不奇怪 – 也许程序试图自动产生X个线程,并且如果其中一些线程失败,立即杀死它们。

要求您的pipe理员准确解释他们正在完成的任务以及原因。

我的猜测是数据库configuration不正确,并有任意的稀缺资源。 例如,参数PROCESSES和SESSIONS通常默认为低值。 如果这些值保持在一个很小的值,比如100,那么就会出现问题,用户不得不争夺连接。

减less数据库中的会话数量可能会有所帮助。 但2的限制是不现实的。 我看到很多数据库在数千个会话的旧硬件上运行。

我自己回答这个问题,因为发生了什么事是IT团队在我们开始遇到问题的那一天改变了一些configuration…用户从无限的请求configuration到2.在我们的代码中,我们使用asynchronous(nodejs )方法调用eachLimit,在那里你可以分配一个极限迭代计数,它是2,但不知何故使它崩溃(即使限制为2)。

解决scheme:删除迭代器,并手动执行1个1(只有4个元素),反正它仍然是苛刻的,因为我们必须每天做这个任务。

谢谢你们的帮助!