2013-03-03 139 views
2

我有一個簡單的任務 - 從SQL表中讀取數據,處理數據,並且一旦完成 - 更新數據庫中的字段(set processed = true),因此每個記錄只應處理一次。從多個線程讀取SQL數據

你能告訴我,我可以用什麼技術來做到多線程?這意味着,從多線程表中讀取數據。

+0

您可能不需要多個線程。你爲什麼認爲你這樣做? – 2013-03-03 21:09:30

+0

@JohnSaunders爲什麼不呢?如果數據彼此不相關(即,設置前N個記錄對後續N個記錄批處理沒有影響),那麼這是多線程的理想候選。如果有一個長時間運行的查詢,通常將其拆分將減少總體處理時間。 – 2013-03-04 01:38:39

+0

@DavidKhaykin:涉及多少磁盤I/O?你確定數據庫不能比你更好的多線程嗎? – 2013-03-04 02:14:40

回答

3

如果你想讀取多個線程中的數據沒有重疊,那麼你可以嘗試分頁。您可以讓每個線程讀取不同的頁面。例如,您可以讓第一個線程讀取前20條記錄,處理每條記錄,然後爲每條記錄設置processed = true,而第二個線程對接下來的20條記錄執行相同操作,依此類推。

查看此鏈接瞭解更多有關多線程分頁的信息。 http://ericniemiec.wordpress.com/2010/06/10/paging-records-in-sql-server-2008-for-processing-database-records-on-different-threads-in-c/

+1

是的,我只是補充說批量大小應該取決於預期記錄集的整體大小,以便一些試驗和錯誤類型的調整可以揭示將數據分解成的理想批次數。 – 2013-03-04 01:39:57

+0

感謝您讓我朝着正確的方向前進! – berliner 2013-03-04 09:00:49

1

如果使用ef並使用DataContext,則應該知道DataContext不是線程安全的。像MsSQL這樣的數據庫管理系統是線程安全的。我更喜歡你讀這個question