旧版 C++ 应用程序例程使用 OCI C 库方法 ping 我们的 Oracle 11g 数据库 OCIPing():
sword OCIPing ( OCISvcCtx *svchp,
OCIError *errhp,
ub4 mode );
此应用程序正在被现代 C#.Net 应用程序取代,我看不到提供相同功能的明显 API。是否存在允许调用 .Net 库、REST 接口等的工具?
正确的做法是什么?我想象 C API 可以通过 .Net 应用程序调用,但如果有更现代的替代 API,那将是首选。
我不知道在 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 个可调参数: