2012-02-13 69 views
0

我想知道我的數據庫是否正在運行或不是從我的java代碼中運行。我不確定哪種方法最適合。最明顯的是有一個線程定期輪詢數據庫。另一種方法是使用觸發器。我不擅長觸發器,但我知道你可以觸發更新,插入和刪除的觸發器。但是,當數據庫關閉時可以觸發觸發器嗎?當數據庫關閉時,觸發器將無法正常工作。檢查數據庫是否正在運行使用Java

PS:我們使用的是現在的數據庫是Oracle,但我相信同樣的解決方案可以應用到任何數據庫

感謝

回答

2

觸發器是典型的服務器端的結構;所以要「觸發一個觸發器」,你需要能夠首先連接到數據庫,這將需要啓動,這沒有幫助。

「檢查服務器是否啓動」的動機是什麼?它是否經常崩潰,或者您在執行數據庫調用之前要格外小心,數據庫沒有崩潰或您的網絡連接丟失?

如果是第二個原因,假設您正在使用Java Oracle驅動程序,那麼只會從失敗的調用中獲得異常。

對您的呼叫進行編碼以捕獲這些異常並重新嘗試連接以重試呼叫。這樣你就不需要輪詢數據庫;您只需在連接中斷時響應(不頻繁)事件。

如果您嘗試5次左右重新連接並且無法重新連接,那麼您可以通知呼叫者數據庫已死,並向您的管理員或其他人發送電子郵件。

這裏有許多策略,但重點是如果您試圖確保調用執行,只需等待java驅動程序失敗並告訴您而不是在單獨的線程上輪詢數據庫服務器。沒有必要。

+0

我實際上正在創建一個儀表板應用程序,讓人們查看每個服務器的狀態。所以,我需要實時知道數據庫是否關閉。如果數據庫關閉,我立即需要更新儀表板應用程序中的狀態。 – CuriousCoder 2012-02-13 19:19:08

+0

噢好的;那麼只是在儀表板啓動時輪詢它,或者寫一個簡單的輪詢機制服務器端,試圖在數據庫上進行一個非常簡單的操作,如「SELECT * FROM user LIMIT 1」或一些應該立即執行並返回的廢話。捕捉驅動程序中的任何異常,更新儀表板並讓它知道服務器已關閉。 – 2012-02-14 00:51:30

1

如果這是一個狀態儀表板應用程序,我會建議定期(每隔10分鐘?)檢查一下您正在監視的每個數據庫服務器。如果無法使用ICMP ping或嘗試打開到端口的連接來ping設備,則應該是高級警報,指示完全硬件故障或網絡故障。如果可以ping,請嘗試連接到數據庫端口。如果你不能,它表示一些軟件故障。

如果這可行,請嘗試運行一個簡單的查詢。如果這引發異常,這是一些其他軟件錯誤。如果它工作,但比某個預設閾值慢,那麼它本身可能不是錯誤,但表示服務器處於「水下」狀態。您可能想要在儀表板上點亮黃色。

您還可以嘗試監控數據庫CPU負載和整體CPU負載,使用的交換文件數量等,以評估服務器的狀態。