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

时间:2012-08-13 17:11:18

标签: oracle10g odp.net

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

但是,在我们的Oracle 10g数据库中,我们发现Oracle User“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 个答案:

答案 0 :(得分:1)

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

首先,通常,三层应用程序将使用中间层中的连接池。这意味着中间层服务器打开与数据库的连接池,这些连接池将长时间保持打开状态,并根据需要分发给Web会话。这意味着单击整个站点的单个Web用户可能会在每次单击时获得不同的数据库会话,并且大量Web用户将使用单个数据库会话。

如果为连接池连接设置CONNECT_TIME

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

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