+ -
当前位置:首页 → 问答吧 → 数据库DBLink的失效检测

数据库DBLink的失效检测

时间:2011-09-02

来源:互联网

最近碰到个问题,应用A需要用访问应用B的数据,两个应用的数据在不同的数据库上。为了实现A对B的访问,利用了数据库Dblink访问远程表,运行正常了一段时间。某日发现应用A异常,查原因发现是应用B的数据库down了,此时查询远程表的数据,SQL语句就会一直等待下去,直到会话超时。也就是说应用B的数据库down会导致应用A异常,错误异常号是:-12170。加入异常处理后,用户3-5分钟才会得到提示,这个用户是难以接受的,请问如何缩短这个时间?


Report
------------------------------------------------------------------
procedure A1(p_type number, p_engn varchar2) is
    l_address varchar2(2000);
    l_string  varchar2(1000);
    l_key     varchar2(100);
  
  begin
    l_address := getldURL;
  
    if p_type = 1 then
      IF l_address is not null THEN
        l_string := 'web_view_query.j_list?p_engn='
        begin
        exception
          when others then
            p_sqlcode := sqlcode;
            p_sqlerrm := sqlerrm;
            if p_sqlcode = '-12170' then
              p_result_msg := p_SQLERRM || ':' || '系统连接超时';
            else
              p_result_msg := p_sqlcode || '-' || p_SQLERRM;
            end if;
            raise my_error;
        end;
        l_address := l_address || l_string || '&p_key=' || l_key; --拼地址
        owa_util.redirect_url(l_address);
      END IF;
  end;

作者: ostart2006   发布时间: 2011-09-02

没人理,自己先来一个

考虑作个监测程序,如果发现数据库链路断了,把数据库链路设为无效状态。

作者: ostart2006   发布时间: 2011-09-02

应用都放到应用层去解决,为什么要用DBLINK呢

作者: maolinxie   发布时间: 2011-09-02

你试试这样的格式吧:

ORCL =
  (DESCRIPTION =
  (CONNECT_TIMEOUT=5)(RETRY_COUNT=1)
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

作者: ocpdba591   发布时间: 2011-09-02

恩,应用的部分程序用了存储过程,所以只能用DBLink。

谢谢ocpdba591 ,我试下。

作者: ostart2006   发布时间: 2011-09-02

有新发现,就是如果对方数据库彻底down了,错误也可以很快出来的。但是如果对方数据库可以运行,但是因为归档满,进程数超出限制时,就会陷入长时间的等待。

作者: ostart2006   发布时间: 2011-09-02