c# - ODP.Net OracleConnection.Open 冷启动很慢

标签 c# .net oracle odp.net

我有一个 WebAPI 服务,它使用 Oracle.ManagedDataAccess.dll 连接到 Oracle 数据库。每次重置应用程序池(或部署)后,第一个 OracleConnection.Open() 语句都会有很长的延迟。通常约为 8 秒。随后的调用每次大约 0.5 秒。

在阅读了很多关于服务器操作系统和网络问题的建议后,我将范围缩小到 oracle 客户端本身。如果我远程调试我的代码,在 open 语句上设置断点,然后运行 ​​Sysinternals Process Monitor,我可以确认第一个 open 语句产生 544 个条目,第二个和后续测试产生 2 个条目。

条目非常随机,但主要与密码学有关。日志的快速概览:

  • RegOpenKey、HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types\Type 001
  • RegOpenKey、HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Strong Cryptographic Provider
  • RegSetInfoKey、HKLM\SOFTWARE\Microsoft\Bryptography\MachineGuid

这些重复了几次,然后有如下部分:

  • RegQueryValue、HKLM\System\CurrentControlSet\WinSock2\Parameters\Protocol_Catalog9
  • RegCreateKey, HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
  • RegCreateKey、HKLM\System\CurrentControlSet\Services\DnsCache\Parameters
  • RegOpenKey、HKLM\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient

然后是多次读取 machine.config 文件,然后是多个 TCP 连接并接收到 oracle 端口 1521。接下来是从注册表中读取时区的部分。

我的问题是,为什么oracle客户端在第一次打开时会做这一切?有什么办法可以预先确定其中一些问题的答案吗? (比如配置时区,这样它就不必“询问”Oracle)?

最佳答案

只有当 tns 连接描述符中的地址未完全限定时,我才看到类似的情况,即 host=computername,而不是 host=computername.domain.com。

问题很可能是 DNS 解析,因为它通过后缀。我想你可以输入一个 ip 并完全消除 dns 作为测试。考虑同时发布您的 tns 条目和连接字符串。

仅供引用,创建第一个连接时会发生很多事情,即建立池并实际打开连接与仅从池中获取连接,初始化自调整的初始参数等,所以我认为数字reg reads 可能是红色听力。

关于c# - ODP.Net OracleConnection.Open 冷启动很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37993665/

相关文章:

C# WPF Web 浏览器控件 : How to use JavaScript

c# - 与 C# 中的 NULL 混淆

c# - 依赖注入(inject)——通过配置文件在运行时选择DLL和类实现

c# - 只写属性,有什么意义?

.net - 如何在 xaml 中绑定(bind)到动态 xpath?

oracle - 使用 bash 运行 SQL*Plus 会导致编码错误

sql - 如何在 Oracle IDE 中获取查询执行计划?

c# - c#的无锁哈希表

c# - 使用 MS Graph 时可以避免在 Azure 中注册我的应用程序吗?

sql - lsof 如果文件描述符已打开