2012-01-31 41 views
1

我有一臺機器,它在一天的開始時(上午12點)創建一個新的日誌文件,並在每天結束時更新日誌文件。將文本文件導入到SQL Server 2008數據庫實時時間

  1. 如何將數據實時導入到我的SQL服務器數據庫(30秒,1分鐘或任何時候有變化)?
  2. SQL Server 2008能夠訪問活動日誌文件嗎?如果不讓我的機器在有任何更新時創建新的日誌文件,會不會更容易?但如果是這樣,我如何實時導入具有不同名稱的如此多的日誌文件。 (我必須能夠擴展解決方案達到多臺機器)

THX很多

回答

1

您可以登錄使用反時間戳每個新行。

由於您只需要在文件更改時進行登錄,就可以實現內存隊列 ,該隊列從文件讀取並存儲數據。 然後實現一個生產者消費者模型,其中一個線程從隊列讀取數據並將消費者日誌載入數據庫。 然後,Windows服務可以繼續讀取隊列並登錄到SQL Server。 (因爲它是一個生產者消費者,在隊列爲空的情況下不會有任何忙碌的等待)

不知何故,每當你做出每個日誌時,你也必須通知生產者線程。這可以通過套接字/或其他方式來完成,以防您可以訪問正在進行日誌記錄的代碼。

+0

如果我沒有訪問正在進行日誌記錄的代碼,該怎麼辦?機器由第三方維護 – user1179728 2012-01-31 08:07:46

0

怎麼樣的SSIS包由SQL Server的預定作業被稱爲?

1

如果您無法控制生成該文件的應用程序,那麼您除了輪詢文件外別無選擇。編寫定期輪詢文件並將增量寫入數據庫的應用程序。應用程序需要記錄上次讀取的高水位標記。

另一個問題是,如果應用程序在寫入之間沒有關閉文件,那麼上次訪問的時間戳可能不會更新,因此檢查文件的年齡可能不可靠。在這種情況下,你需要實現這樣的過程:

  • 打開日誌文件
  • 尋找到你的最後記錄的EOF位置
  • 嘗試閱讀
  • 如果成功的話,處理新的數據,直到你到新的EOF。
  • 更新你的執着EOF位置
  • 關閉文件

您需要確保的字節數讀取文件對齊尋求位置。如果日誌文件是unicode,那麼在字節和字符之間可能沒有1:1映射。您可能需要以二進制模式讀取文件的塊,並從緩衝區轉換爲字符。

解析日誌文件條目後,您可以插入數據,或者對較大的數據卷使用SQLBulkCopy。

如果您可以放鬆延遲限制並且日誌文件足夠小,那麼您可能只需實現一個將日誌文件複製到暫存區域並定期重新加載整個事件的進程。

相關問題