2011-05-28 138 views
7

我開發了Windows服務,必須在Windows啓動過程中自動啓動。此服務連接到Oracle數據庫,因此我通過sc命令行實用程序使我的服務依賴於Oracle服務: sc config MyService depends = OracleServiceXE/OracleXETNSListener在Windows啓動時自動啓動Windows服務,這取決於Oracle

到目前爲止,依賴性已成功設置。但是,當Windows啓動時,我的服務無法啓動,我收到以下(Oracle)錯誤消息:「ORA-12528:TNS:偵聽器:所有適當的實例阻塞新連接」。

正如我所想,Oracle服務是在我的服務啓動時啓動的,但它們沒有「完全初始化」。幾秒鐘後,我可以從服務控制檯開始我的服務,沒有任何問題。

那麼,如何在Windows啓動時自動啓動依賴於Oracle數據庫連接的服務?

我的服務是在VS 2010環境中使用.Net 4平臺上的C#開發的。

請注意。幫助我,這對我來說是一項非常重要的任務!

回答

10

請記住,服務啓動的代碼應儘可能少。換句話說,不要讓你的服務啓動檢查Oracle服務器的可用性,或者確實做任何事情。讓服務做到以下幾點:

  • 登錄,它的啓動
  • 負載從配置文件/註冊表/等任何適用的配置其實
  • 自旋向上的線程將嘗試和「啓動」服務正確地每N秒鐘,並將重複M次,直到它放棄。從配置文件/註冊表中配置N和M

讓線程「嘗試」連接到適用的Oracle服務器,如果失敗,請進入睡眠N秒,然後執行此操作M次。如果成功了,它就可以開始做它應該達到的「肉」。具有諷刺意味的是,這可能是Oracle服務做了類似於我所建議的那樣的事情,這會導致你的問題。通過返回「是的,我已經開始」,它在啓動時很快回到Windows,它允許您的服務被加載,即使Oracle仍在忙着做東西。理想情況下,在這種情況下,Oracle應該排隊處理它們,而不是拒絕您的請求。

+0

Thx你的答案。這對我來說聽起來很糟糕:(我的服務必須連接到配置文件(mysql,ms access,sqlite ...)中設置的任何類型的數據庫,因此它可以使用不同的db-s來運行。只有在Oracle的情況下才會出現這種問題,所以對於我來說,重新設計我的應用程序聽起來非常糟糕,僅僅是因爲Oracle,我認爲還有一個更直接的解決方案:(Thx again! – Tom 2011-05-28 12:50:26

+1

@Keller,you can不要確定*任何*數據庫服務器都不會出現這種行爲,因此將這種「彈性」放入服務中並不會造成什麼傷害。令人討厭但不是世界末日!您從分離中獲得的另一個優勢從服務核心本身開始,您的「業務邏輯」就是可測試性;爲沒有綁定到Windows服務的「OnStart」方法的代碼編寫測試更容易=) – Rob 2011-05-28 13:43:01