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

Oracle10g 由.NET web应用程序生成的Oracle会话和进程,oracle10g,odp.net,Oracle10g,Odp.net,我们的.NET web应用程序使用ODP.NET进行连接,其用于连接数据库的Oracle用户是“webuserOracle”。该web应用始终关闭连接并释放连接 然而,在我们的Oracle 10g数据库上,我们看到Oracle用户“webuserOracle”的会话和进程值总是很高,因为它们不会关闭或死亡 我们决定在Oracle配置文件上设置“webuserOracle”,以便将连接时间限制为5分钟 CREATE PROFILE profile_webuserOracle LIMIT CONNE

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

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

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

CREATE PROFILE profile_webuserOracle LIMIT CONNECT_TIME 5;

ALTER USER webuserOracle PROFILE profile_webuserOracle;
问题:

对于web应用程序,将连接时间限制为5分钟,意味着用户可以与web应用程序进行交互,比如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()

在web应用程序的配置文件中设置
CONNECT\u TIME
,可能是一个非常糟糕的主意

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

如果为连接池连接设置了
CONNECT\u时间

  • 中间层可能会不断收到错误,因为它从连接池获得的特定连接已超过其允许的连接时间。您可以让中间层对从池中获得的每个连接执行一个虚拟查询(即,
    从dual
    中选择1),以验证在交互开始前5分钟是否已过,但不能保证在页面上运行第一个查询时不会达到超时,从而减轻部分影响
  • 中间层将不断打开到数据库的新物理连接(这是一个相当昂贵的过程),以替换已关闭的连接,因为这些连接已打开5分钟。这些连接风暴可能会给数据库带来巨大的负载。这也会给应用程序带来性能问题,因为用户一直在等待打开新的物理连接,而不能重用池中的连接
  • 如果进行此更改,会话和进程的数量可能会高得多。中间层将维持为用户提供服务所需的实际物理连接数量,再加上一些过期的连接,这些连接必须保留下来,以便通知下一个调用方它们已过期
你想解决的真正问题是什么?中间层维护不关闭的数据库连接池是完全正常的。这是完全正常和健康的。如果要减少在任何时候打开的连接数,可以调整中间层服务器上的连接池设置