2010-10-03 139 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);