2010-10-03 108 views
4

我有一个主数据库,只有总部的设置数据和不同分支的几个数据库,我为每个分支服务器创建了一个数据库链接。如何检查数据库链接在Oracle中是否有效?

在某些情况下,我想查询所有有效的链接(因为某些链接可能因连接问题或其他原因而无效),所以我的问题是如何检查数据库链接是否有效,但没有进入连接超时问题,是否有一个SQL语句让oracle主服务器执行检查并仅返回有效的数据库链接?

在此先感谢。

回答

2

我不确定你可以创建一个查询来检查实时数据库链接。 你可以做的一件事是创建一个表,通过后台进程更新数据库链接列表,并为他们每个人'上次看到活着'时间戳

+0

这可能是一个解决方案也,日Thnx vc74 – Khaled 2010-10-03 14:04:47

2

任何链接可能有问题,由于不同类别的问题:

  • 无效链接定义:错 用户名,密码(如果有),服务 名

  • 远程帐户锁定

  • 远程数据库配置(例如每个用户的会话超标)

  • 远程分贝或主机不可用

  • 网络连接

鉴于这些故障模式的不断变化的性质不能有一个字典视图(例如)描述链接的状态。在后台进行检查的异步进程也有可能会过时。你可以做的最轻的测试可能是在你需要使用你的代码中的链接之前发出“select @ sysdate from dual @ remote_db”

+1

感谢乌拉圭回合的答案,但这个问题我面对这种方法是等待,直到我得到超时exception.so如果任何数据库链接不可用任何原因,我将不得不等待,直到服务器停止尝试连接! – Khaled 2010-10-03 14:17:48

1

你可以编写一个执行tnsping的操作系统级脚本,因为db链接通常无论如何,依赖于tnsnames.ora。

+0

听起来像个好主意,但怎么做呢? – Khaled 2010-10-04 09:43:46

+0

对于Windows ... tnsping ...在tnsping之后立即检查%errorlevel%值。如果它是0 == OK,则1 == ERROR。对于UNIX返回码是$? (相当于错误级别)。 – Stellios 2010-10-04 23:53:20

+0

我会试试这个,thanx – Khaled 2010-10-05 08:51:28

0

我不知道你是否设法完成了这件事,但我想要做这样的事情,并检查哪些数据库链接是活动的。我发现这在另一个论坛上

Select * from v$dblink 

它只显示活动的数据库链接。同样,只有在您有权访问v$dblink时,此功能才有效。

0

@Sushant Nayak 是的,我做到了。

我试过“Select * from v $ dblink”但它不起作用,可能是因为权限。

我能够通过创建一个包含每个dblink的目标数据库的表来实现它。然后我使用Quartz dll根据间隔运行一个函数,该函数在一个单独的线程中执行,它通过查询任何系统表来检查数据库链接。如果它在特定时间(毫秒)之前响应,那么它将表中dblink的状态设置为true ..如果不关闭函数的线程并设置状态为false ..然后在任何查询中,我排除不活动的dblinks。

我希望它能帮助

哈立德

4

你可以通过执行验证数据库链接:

select * from [email protected]_db_link; 

为了可以创建功能验证数据库链接:

function is_link_active(
    p_link_name varchar2 
) return number is 
    v_query_link varchar2(100) := 'select count(*) alive from [email protected]'||p_link_name; 
    type db_link_cur is REF CURSOR; 
    cur db_link_cur; 
    v_status number; 
begin 
    open cur FOR v_query_link; 
    loop 
    fetch cur INTO v_status; 
    exit when cur%notfound; 
    dbms_output.put_line('v_status='||v_status); 
    return v_status; 
    end loop; 
    close cur; 
exception when others then 
    close cur; 
    return 0; 
end is_link_active; 

最后,你可以创建表my_db_links(id,name,status(0,1))并更新它:

update 
    my_db_links mdl 
set 
    mdl.status = is_link_active(mdl.name); 
相关问题