【问题标题】:Is connection pooling a must-have in ODP.NET?连接池是 ODP.NET 中的必备工具吗?
【发布时间】:2012-11-22 06:01:24
【问题描述】:

我正在编写一个夜间作业,使用 ODP.NET 将数据从 SQL Server 移动到 Oracle。

我们使用大约 100 个连接对象(与数据无关),并且我们预计单次运行中传输的行数不会超过 1500 行(总共)。 我读过的 ODP.NET 笔记和资料从不谈论关闭连接池。

在开发中,我关闭了连接池,它工作正常。

在给定的场景中是否建议关闭连接池,(假设所有连接在使用后都正确处理)因为:

  1. 这是一项夜间工作,Oracle 服务器上的负载不会太大。

  2. 连接池可能会返回陈旧的连接,需要对其进行验证设置/异常处理。

【问题讨论】:

    标签: .net oracle odp.net


    【解决方案1】:

    池化的唯一原因是性能,因此如果您的夜间作业在它的窗口内运行,那么您所做的事情并没有错,尤其是因为它使您的实现简单,不必担心死连接。

    也就是说,我不会制定这种标准做法。我很少编写代码来处理陈旧的连接,即使那样它也是一个简单的工厂。问题从为什么你有过时的连接开始?通常,这与终止空闲连接的防火墙或 DBA 作业有关,对于应用程序帐户,这两者都应更改或放宽。即使在这种情况下,您也可以执行以下操作:

    • 在您的连接字符串中指定 Min Pool Size=0。这样做可以让 ODP.net 清理您的应用的最后一次连接,让您的应用在空闲足够长的时间后完全断开连接。
    • 在连接字符串中指定更高的 Decr 池大小。这将允许 ODP.net 每 3 分钟关闭更多空闲连接。
    • 您可以尝试设置 Validate Connection = true - 我猜验证连接的开销比打开连接的开销要少。

    更多信息可以在这里找到: http://docs.oracle.com/cd/E15296_01/doc.111/e15167/featConnecting.htm#i1006228

    【讨论】:

    • 当防火墙关闭我们的空闲连接时,我们遇到了这个问题。 Pool Size=0 似乎对我们有用。
    • @b_levitt 快速澄清问题...如果启用池(默认情况下)并且我将最小池大小设置为 0 - 这与禁用池不是一回事吗?
    • 没有。当应用程序不那么忙时,像 DecrPoolSize 这样的设置会慢慢修剪池。也就是说,池最多有 45 个连接,但当前站点负载仅导致其中 15 个被使用。 DecrPoolSize 将一次从池中释放 x 个连接。但是,我认为 Min Pool Size 的默认值为 3 - 当防火墙或 oracle 在设定的时间段后终止空闲连接时,这是有问题的。如果池中长期存在 3 个连接,它们可能会被切断。 Min Pool Size=0 将允许池在这些缓慢的时间里达到零连接。
    • 我要补充一点,sql server 的默认最小池大小为 0。我不知道甲骨文为什么选择 3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多