代码之家  ›  专栏  ›  技术社区  ›  Delmonte

由.NET web应用程序生成的Oracle会话和进程

  •  0
  • Delmonte  · 技术社区  · 12 年前

    我们的.NET web应用程序使用ODP.NET进行连接,其用于连接数据库的Oracle用户是“webuserOracle”。该web应用程序总是关闭连接并处理连接。

    然而,在我们的Oracle 10g数据库中,我们看到Oracle用户“webuserOracle”的会话和进程值总是很高,因为它们不会关闭或死亡。

    我们决定为“webuserOracle”设置Oracle配置文件,以便将连接时间限制在5分钟以内。

    CREATE PROFILE profile_webuserOracle LIMIT CONNECT_TIME 5;
    
    ALTER USER webuserOracle PROFILE profile_webuserOracle;
    

    问题:

    对于网络应用程序,将连接限制在5分钟内,意味着用户可以与网络应用程序交互,例如2小时。5分钟的限制仅适用于触发(如单击按钮)连接到数据库的事件。对于Con.Open和Con.Dispose之间发生的一切,需要5分钟:

    Dim con As OracleConnection = oraConexion()
    con.Open()
    ''' There'll be a limit of 5 minutes to run the code here
    con.Close()
    con.Dispose()
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   Justin Cave    12 年前

    设置 CONNECT_TIME 在web应用程序的配置文件中可能是一个非常糟糕的主意。

    首先,一般来说,三层应用程序将利用中间层的连接池。这意味着,中间层服务器打开一个到数据库的连接池,这些连接池在很长一段时间内保持打开状态,并根据需要分发给web会话。这意味着,在网站上点击的单个网络用户每次点击都可能获得不同的数据库会话,并且单个数据库会话将被大量网络用户使用。

    如果您设置 连接时间 对于您的连接池连接,

    • 中间层可能会不断出现错误,即从连接池中获得的特定连接已超过其允许的连接时间。您可以通过让中间层执行一个伪查询(即。 select 1 from dual )在它从池中获得的每个连接上,验证在交互开始之前没有经过5分钟,但不能保证在页面上运行第一个查询时不会达到超时。
    • 中间层将不断地打开与数据库的新物理连接(这是一个相当昂贵的过程),以替换由于打开5分钟而关闭的连接。这些连接风暴可能会给数据库带来巨大的负载。这也会给应用程序带来性能问题,因为用户一直在等待打开新的物理连接,而不能重用池中的连接。
    • 如果进行此更改,会话和进程的数量可能会高得多。中间层将维护为用户提供服务所需的实际物理连接,再加上一些过期的连接,这些连接必须保留下来,只是为了通知下一个调用者它们已经过期。

    你想解决的真正问题是什么?中间层将维护一个不关闭的数据库连接池,这是非常正常的。这是完全正常和健康的。如果您想减少任何时候打开的连接数,可以调整中间层服务器上的连接池设置。