【问题标题】:To close or not to close an Oracle Connection?关闭或不关闭 Oracle 连接?
【发布时间】:2012-04-12 15:20:16
【问题描述】:

我的应用程序有性能问题,所以我开始从根本上调查这个问题:“与数据库的连接”。

最佳实践说:“打开连接,使用它并尽快关闭”,但我不知道这会导致开销,所以问题是:

1 -“尽快打开、使用、关闭连接是使用 ODP.NET 的最佳方法吗?”

2 - 有没有办法以及如何在 ODP.NET 中使用连接池? 我正在考虑创建一个列表来存储一些连接字符串并创建一个逻辑来在每次需要时选择“最佳”连接。这是最好的方法吗?

【问题讨论】:

  • 您说的是客户端/服务器应用程序吗?还是三层应用程序?你是说你已经分析了应用程序并确定打开和关闭数据库连接是一个瓶颈吗?还是您只是猜测性能问题可能与数据库有关?
  • 这是谁的最佳实践?打开与数据库的连接是一项昂贵且耗时的操作。因此,最好的建议是尽可能长时间地保持连接打开和使用。
  • 贾斯汀。是的,它是一个 Asp.Net 应用程序,所以它是客户端/服务器,有 3 层或 4 层,“打开连接操作”不是瓶颈,但我想它会导致性能下降(如果没有正确使用)。
  • APC。根据 Microsoft Ado.Net 团队的说法,这是一种最佳实践。请参阅下面的答案

标签: oracle connection connection-string connection-pooling odp.net


【解决方案1】:

这是一个包含 Oracle 推荐的最佳实践的幻灯片:

http://www.oracle.com/technetwork/topics/dotnet/ow2011-bp-performance-deploy-dotnet-518050.pdf

您在创建 OracleConnection 时会自动获得一个连接池。对于大多数中间层应用程序,您将希望利用它。您还需要通过打开注册表中的性能计数器来调整池以适应实际工作负载。

有关连接池的详细信息,请参阅 ODP.NET 联机帮助。池设置被添加到连接字符串中。

人们在使用 OracleConnections 时经常遇到的另一个问题是垃圾收集器没有意识到它们是真正的资源密集型,也没有及时清理它们。由于 ODP.NET 没有完全托管,因此一些资源对垃圾收集器隐藏,这使情况更加复杂。因此,最佳做法是 Close() AND Dispose() 所有 Oracle ODP.NET 对象(包括 OracleConnection)以强制清理它们。

这个特殊问题将在 Oracle 的完全托管提供程序中得到缓解(很快就会推出测试版)

(编辑:ODP.NET,托管驱动程序现已推出。)

克里斯蒂安·谢伊

甲骨文

【讨论】:

    【解决方案2】:

    ODP.NET 是 ADO.NET 的数据提供者。 ADO.Net 的最佳实践是打开、获取数据(到内存)、关闭、在内存中使用数据。 例如使用 OracleDataReader 将数据加载到内存中的 DataTable 中并关闭连接。

    []的

    【讨论】:

      【解决方案3】:

      对于单个事务,这是最好的,但对于最后提交的多个事务,这可能不是最佳解决方案。您需要保持连接打开,直到事务提交或回滚。在这种情况下,您如何管理以及如何检查连接是否仍然存在?(即网络故障)此时有 ConnectionState.Broken 属性不起作用。

      【讨论】:

        猜你喜欢
        • 2012-07-04
        • 2011-10-10
        • 2017-06-19
        • 1970-01-01
        • 2018-09-09
        • 2011-06-25
        • 2019-07-27
        • 1970-01-01
        • 2012-09-19
        相关资源
        最近更新 更多