2010-06-29 13 views
1

任務:在ms sql數據庫中定期寫入時間戳的實現

每秒向MS SQL數據庫表中寫入時間戳。

解決方案:

  1. 外部應用程序,它通過時間表寫入時間戳(SQL代理例如)。
  2. 存儲過程,它在無限循環中寫入時間戳。

問題。

  1. 哪個解決方案最好?
  2. 在存儲過程中運行無限循環有什麼缺點嗎?
  3. 如何在服務器重啓後啓動存儲過程?
  4. 其他解決方案?
+0

寫時間戳到MS SQL數據庫表中的每一秒。 - 爲什麼有人想在真實生活(tm)中做到這一點? – ty812 2010-06-29 08:39:57

+1

這個問題(真實生活)可以通過在這裏描述的數據庫中連續寫入時間戳來解決:http://stackoverflow.com/questions/2995462/how-to-synchronize-two-or-n-replication-processes-for -sql-server-databases。 – 2010-06-29 09:29:13

回答

2

1,兩者都有優點和缺點。根據您的環境進行評估和選擇

程序優點:
- 不要每秒處理一次SQL代理程序的開銷。 (實際上,我不認爲你可以讓SQL代理每秒一次地持續啓動相同的工作。)
- 我不認爲WAITFOR模式下的一個過程是使用資源 - 但是你想檢查

程序Disads:
- 如果程序失敗(以某種方式停止),程序將不會啓動。 (除非你有一個SQL Agent作業運行來檢查過程是否已經停止,在這種情況下也可以使用該過程)
- 可能比你想象的更容易停止/中斷(併發/死鎖,分離的數據庫,維護過程中手動停止,然後忘記重啓)

工作優勢:
- 如果任務失敗(也許DB不可用),接下來的工作仍然會得到推出

工作Disads:
- 似乎很缺憾,讓SQL代理每秒運行一次。如果你這樣做,測量所需的服務器開銷。
- 如果SQL代理失敗或停止,作業將不會運行

建議:每秒鐘必須執行一次嗎?它可以每5,10,15或30次一次?

2,不應該有任何,除了上面提到的。確保你不能打鎖定,阻塞或死鎖!

3,像@gbn說,sp_procoption

4,沒有什麼不基於悲觀鎖的技術,或基於時間戳(未日期時間)的數據類型拜占庭邏輯涉及麻煩的技巧。最好的解決方法似乎是將這兩個數據庫合併爲一個的長期解決方案,但這不是一個短期選擇。

出於純粹的偏執狂,我將二者結合起來,像這樣:

  • 作業設置爲每2,3或5分鐘
  • 作業調用程序,更新你的timesampt運行,那麼waitfors一幾秒鐘
  • 程序不停止,所以作業繼續運行;當作業正在運行時,它將不會啓動(因爲它仍在執行)
  • 如果程序以某種方式死亡,那麼作業將在下次計劃運行時再次啓動它。
+0

SQL代理粒度爲1分鐘,但您可以指定第二秒的開始時間。所以你需要每秒一次60個時間表...... – gbn 2010-07-06 10:23:34

+0

哎唷! (...和墊註釋超過12個字符) – 2010-07-06 14:07:12

1

嘗試使用SQL Service Broker異步執行此操作,並且其隊列系統允許您不會錯過任何數據,即使SQL Server服務將不得不重新啓動。我曾經使用過這種類型的投票場景。

http://msdn.microsoft.com/en-us/library/ms345108(SQL.90).aspx#sqlsvcbr_topic2

這可能幫助, http://msdn.microsoft.com/en-us/library/bb839488.aspx

+0

您能否提供一些細節 - 我無法理解Service Broker如何幫助持續流程?誰會將任務添加到Service Broker隊列中? – 2010-07-06 10:20:28

+0

SQL Service Broker具有基於隊列的對話框,其中發起方和接收方通過事件進行通信。您可以從可能從應用程序/批處理/ Windows服務調用的腳本異步調用此日誌記錄,並將其與常規進程隔離。 http://msdn.microsoft.com/en-us/library/bb839488.aspx - 此鏈接提供了有關創建簡單SQL服務代理隊列組件和傳輸消息的詳細信息。 – Baaju 2010-07-06 12:00:04