我如何从 .Net 应用程序执行 OCIPing(或同等操作)?

问题描述 投票:0回答:1

旧版 C++ 应用程序例程使用 OCI C 库方法 ping 我们的 Oracle 11g 数据库 OCIPing():

sword OCIPing ( OCISvcCtx     *svchp,
                OCIError      *errhp,
                ub4            mode );

此应用程序正在被现代 C#.Net 应用程序取代,我看不到提供相同功能的明显 API。是否存在允许调用 .Net 库、REST 接口等的工具?

正确的做法是什么?我想象 C API 可以通过 .Net 应用程序调用,但如果有更现代的替代 API,那将是首选。

.net oracle11g oracle-cloud-infrastructure
1个回答
1
投票

我不知道在 C#.Net 的情况下情况如何,但在 Java 的情况下,Oracle 通过添加

boolean isValid(int timeout) throws SQLException
设法扩展了 JDBC 标准。较新版本的 JDBC 驱动程序会调用
OCIPing()
。这是检测数据库连接是否仍然活动的最简单、最快的方法。

如果C#.Net没有类似的东西,你将不得不定期调用一些简单的SQL。

另一个选项:您还可以通过在数据库连接字符串中添加

(ENABLE=BROKEN)
并调整一些内核参数(寄存器)来在Oracle连接中使用TCP Keepalive。喜欢:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime

在这种情况下,探测数据包将不会由您的应用程序发送,而是由操作系统内核发送。通过添加

(ENABLE=BROKEN)
,驱动程序将在 TCP 套接字上调用特定的
ioctl()
并指示内核发送这些探测。注册表中需要启用 3 个可调参数:

  • 发送第一个探测之前的延迟(KeepAliveTime)
  • 探针之间的延迟(KeepAliveInterval)
  • 丢失探针的数量,达到此限制后,TCP 连接将关闭,您的应用程序将无法再写入 SE 套接字。
© www.soinside.com 2019 - 2024. All rights reserved.