代码之家  ›  专栏  ›  技术社区  ›  Kosi2801

如何检测Oracle断开/停止的连接?

  •  4
  • Kosi2801  · 技术社区  · 15 年前

    在我们的服务器/客户机设置中,我们遇到了一些奇怪的行为。客户端是一个C/C++应用程序,它使用OCI连接到Oracle服务器(使用 OTL 图书馆)。

    数据库服务器偶尔会以某种方式死亡(是的,这是核心问题,但从应用程序方面来说,我们无法解决它,但无论如何都必须处理它),即机器不再响应新的请求/连接,但现有的请求/连接(如Oracle连接)不会中断或超时。发送到数据库的查询不再成功返回。

    Oracle提供了哪些可能性(如果有的话),可以从客户端应用程序端检测到这些暂停的连接,并以或多或少安全的方式进行恢复?

    6 回复  |  直到 12 年前
        1
  •  3
  •   siddhusingh    14 年前

    这是Oracle 11.1.0.6之前的一个bug(或者称之为特性),他们说Oracle11g版本1(补丁11.1.0.7)上的补丁已经修复了。需要看看。 如果发生这种情况,您将不得不取消(终止)执行此操作的线程。 但是方法不好

        2
  •  1
  •   Pirks    15 年前

    在我的所有DB模式中,我都有一个表,其中有一个常量记录。只需通过简单的SQL请求定期轮询这样的表。其他方法都不可靠。

        3
  •  0
  •   Glen    15 年前

    有一个 set_timeout OTL中可能有用的API。

    编辑:实际上,忽略这个。 设置超时 不适用于OCI。看看 设置超时 描述来自 here 其中描述了一种可以与OCI一起使用的技术

        4
  •  0
  •   Paul Walker    14 年前

    听起来您需要启动对数据库的查询(例如 SELECT * FROM dual; ,然后,如果数据库在指定的时间内没有响应,则假定服务器已死亡,并相应地做出响应。恐怕我不知道C/C++,但是你能用多线程来启动语句,然后等待响应,而不用挂起应用程序吗?

        5
  •  0
  •   Philip Schlump    14 年前

    这是可行的-我已经做了你想要的。 让父进程(a)创建子进程(b)。子进程(b)连接到数据库, 执行一个查询(类似于“从表中选择1”-如果避免使用“dual”进行查询并创建自己的表,您将获得更好的性能。如果(b)成功,那么它会写出它成功并退出。(a)正在等待指定的时间。我用了15秒。如果(a)检测到(b)仍在运行-那么它可以假定数据库已挂起-它会杀死(b)并采取必要的措施(比如用短信打电话给我)。

    如果将SQL*NET配置为使用超时,您可能会注意到大型查询将因超时而失败。OCI设置超时配置也会导致这种情况。

        6
  •  0
  •   Jason Plank Vijay    12 年前

    有一种手动方法可以避免这种情况。您可以打开防火墙,并在每个指定的时间段后执行ping数据库之类的操作。这样数据库连接就不会丢失。

    主意

    If (current_time - lastPingTime > configuredPingTime)
    {
         //Dummy query
         select 1 from dual;
    }