【问题标题】:Why does running my application create excess sessions and drop the database connection?为什么运行我的应用程序会创建多余的会话并断开数据库连接?
【发布时间】:2012-12-04 03:25:18
【问题描述】:

我使用 jsp/servlets 创建了一个数据库应用程序,该应用程序现在托管在生产服务器中。但是当我对应用程序执行一些任务时,数据库会话数超过 150,然后连接丢失。如果我不重新启动数据库服务器,我将无法使用该应用程序。我正在使用 ORACLE 11g。

【问题讨论】:

  • “连接丢失”是什么意思?你有错误吗?如果是这样,什么错误?这是 Oracle 错误吗?来自您的应用程序服务器的错误?还有什么?您是否通过查看数据库的数据字典(即v$session)来测量 150 个连接?还是您在寻找其他地方?您正在进行负载测试的活动是否需要 150 个物理连接?如果没有,您的代码中几乎肯定存在连接泄漏。
  • 是的,我想知道如何处理更多指向数据库的进程,我发现我的程序出错了,我没有关闭一些数据库连接。谢谢贾斯汀

标签: database jsp servlets oracle11g


【解决方案1】:

对于这个问题,你可以做两件事,

  1. 您可以使用以下命令超过数据库可以处理的进程数。

    alter system set sessions = 300 scope = spfile;
    

    为此,您必须以系统用户身份登录数据库。

  2. 可以查看是否所有打开的数据库连接都关闭了。

【讨论】:

    【解决方案2】:

    问题是没有正确关闭数据库连接。当我们在每次迭代中没有关闭数据库连接的情况下进行一些重复的活动时。它增加了与数据库的连接数,并根据每个定义达到最大连接数。为了避免这个问题,我们可以做两件事,

    1. 我们可以增加最大会话量。如果您要增加会话参数,您还应该考虑增加进程和事务参数。这是您可以用来确定其值的公式。

    进程=x
    会话=x*1.1+5
    交易=会话*1.1

    要做到这一点,请使用下面的 sql 脚本

    sql> alter system set processes=500 scope=both sid='';
    sql> alter system set sessions=555 scope=both sid='
    ';
    sql> alter system set transactions=610 scope=both sid='*';

    1. 另一种方法是您可以将您的应用程序设计为一次不超过先前定义的数据库连接数。 Oracle 会定期自动删除当前未使用的连接。但这需要时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      相关资源
      最近更新 更多