我有一个主数据库,只有总部的设置数据和不同分支的几个数据库,我为每个分支服务器创建了一个数据库链接。如何检查数据库链接在Oracle中是否有效?
在某些情况下,我想查询所有有效的链接(因为某些链接可能因连接问题或其他原因而无效),所以我的问题是如何检查数据库链接是否有效,但没有进入连接超时问题,是否有一个SQL语句让oracle主服务器执行检查并仅返回有效的数据库链接?
在此先感谢。
我有一个主数据库,只有总部的设置数据和不同分支的几个数据库,我为每个分支服务器创建了一个数据库链接。如何检查数据库链接在Oracle中是否有效?
在某些情况下,我想查询所有有效的链接(因为某些链接可能因连接问题或其他原因而无效),所以我的问题是如何检查数据库链接是否有效,但没有进入连接超时问题,是否有一个SQL语句让oracle主服务器执行检查并仅返回有效的数据库链接?
在此先感谢。
我不确定你可以创建一个查询来检查实时数据库链接。 你可以做的一件事是创建一个表,通过后台进程更新数据库链接列表,并为他们每个人'上次看到活着'时间戳
任何链接可能有问题,由于不同类别的问题:
无效链接定义:错 用户名,密码(如果有),服务 名
远程帐户锁定
远程数据库配置(例如每个用户的会话超标)
远程分贝或主机不可用
鉴于这些故障模式的不断变化的性质不能有一个字典视图(例如)描述链接的状态。在后台进行检查的异步进程也有可能会过时。你可以做的最轻的测试可能是在你需要使用你的代码中的链接之前发出“select @ sysdate from dual @ remote_db”
感谢乌拉圭回合的答案,但这个问题我面对这种方法是等待,直到我得到超时exception.so如果任何数据库链接不可用任何原因,我将不得不等待,直到服务器停止尝试连接! – Khaled 2010-10-03 14:17:48
我不知道你是否设法完成了这件事,但我想要做这样的事情,并检查哪些数据库链接是活动的。我发现这在另一个论坛上
Select * from v$dblink
它只显示活动的数据库链接。同样,只有在您有权访问v$dblink
时,此功能才有效。
@Sushant Nayak 是的,我做到了。
我试过“Select * from v $ dblink”但它不起作用,可能是因为权限。
我能够通过创建一个包含每个dblink的目标数据库的表来实现它。然后我使用Quartz dll根据间隔运行一个函数,该函数在一个单独的线程中执行,它通过查询任何系统表来检查数据库链接。如果它在特定时间(毫秒)之前响应,那么它将表中dblink的状态设置为true ..如果不关闭函数的线程并设置状态为false ..然后在任何查询中,我排除不活动的dblinks。
我希望它能帮助
哈立德
你可以通过执行验证数据库链接:
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);
这可能是一个解决方案也,日Thnx vc74 – Khaled 2010-10-03 14:04:47