2014-04-01 112 views
1

我有一個輪詢數據庫的Windows服務。我使用EF6和LINQ做我的查詢和更新等EF6,Windows服務和數據庫輪詢

輪詢需要儘可能多地是,大概每2秒或東西在那個區域。

我的直覺告訴我有一個連接並保持打開,而我的服務正在運行,但別的東西告訴我打開和關閉連接每一次。我覺得後者會減慢它的速度(這會真的減慢它的速度嗎?)。

在Windows服務中查詢數據庫時的最佳做法是什麼?我應該如此頻繁地查詢我的數據庫嗎?

回答

3

我認爲你應該經常處理上下文,並在每次輪詢數據庫時創建一個新的上下文。

主要的原因是,除非你禁用對象追蹤(實際上只適用於只讀操作),上下文變得越來越大隨着時間的推移,每一個連續的輪詢操作加載更多的數據放到上下文的緩存。除了這引起的內存增加之外,隨着ObjectContext查找連接到它的對象的更改,SaveChanges()會變慢。

如果連接丟失因任何原因,你也有一個困難時期關聯與語境一個新的連接。無論如何,基於我自己的經驗,它不會放慢任何速度,在第一個EF對象之後構建任何EF上下文對象都很快,因爲該模型會在第一次加載時緩存。

我不會擔心每2秒鐘進行一次輪詢。這對我來說似乎完全合理。

順便說一句,如果你使用SQL Server,你可以使用SQL的依存關係時數據的變化,但投票是最可靠的選擇觸發事件。

http://msdn.microsoft.com/en-us/library/62xk7953(v=vs.110).aspx

或者,如果你堅決反對投票,你可以看看使用Message Broker的系統一樣的RabbitMQ和更新您的應用程序使用它,但要準備好失去一對夫婦實現周基礎設施。

+0

感謝您將我指向SQL依賴關係,它確實非常有用。你能否詳細說明它爲什麼不可靠?你是否也使用過Entity Framework? – Johan

+0

我在生產中看到SQL依賴關係連接丟失並且事件沒有被觸發的實例。這有點像FileSystemWatcher,值得使用不太頻繁的輪詢進行備份,並經常重新創建SQL依賴關係/觀察器。我沒有用它與實體框架。如果你正在編寫一個Windows服務或者其他的東西,那麼它可能會被無人照看幾個月,有時候沒有人會注意到它是否靜靜地停止工作(即服務沒有「停止」,但它也沒有做任何事情!),所以我喜歡覆蓋所有的基地。 –