我有一个 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/