[英]How to handle long-running operations with the Entity Framework?
我們的團隊正在開發一種機器,該機器將在托盤上執行物理過程,該托盤可容納樣品瓶。 物理過程大約需要1.5小時。 托盤和相關的樣品瓶是使用實體框架從數據庫加載的實體。 當進程運行時,設備將更新實體的值。 這些變化可能會分開幾分鍾或幾秒鍾。 在某些步驟結束時,相隔10到45分鍾,我們希望將這些實體保存回數據庫,並繼續運行。
將實體框架上下文打開1.5小時是否可以接受? 我可以使用該上下文在該時間段內多次進行更改並保存實體嗎? 如果沒有,處理這個問題的最佳方法是什么?
到目前為止一些想法:
2和3的組合將是理想的。
首先,不要一次打開幾個小時的上下文。 您可以通過配置執行此操作,但考慮到您正在執行90分鍾的操作並且打開連接大約需要3毫秒,這只會浪費資源。
因此,只需根據需要創建上下文。 接下來,請記住,雖然您打開上下文來收集數據或維護狀態,但如果數據尚未准備好存儲,則實際上並不需要保存數據。 你可以在本地存儲它。
這是第3步進入的地方,帶有本地內存。 基本上你應該在附加事件處理程序的情況下將它保存在本地內存中。 隨着本地副本的更改,如果在某個可接受的時間窗口內發生了更改,請更新數據庫。
將實體框架上下文打開1.5小時是否可以接受?
更新:根據您鏈接的資源,如果您允許EF管理連接的打開和關閉,它將盡可能晚地打開連接並盡快關閉它,以便可以返回相對昂貴的數據庫連接連接池。 如果手動管理數據庫連接,則連接僅在上下文存在期間保持打開狀態。
在某些步驟結束時,相隔10到45分鍾,我們希望將這些實體保存回數據庫,並繼續運行。
請注意,如果客戶端因任何原因崩潰,則內存中保留的更改將丟失。 在確定您是否確實要等待那么久才能確定數據之前,請考慮這種影響。
如果確定這是並且仍將是一個或只有少數客戶端寫入專用數據庫的架構,我會選擇盡可能簡單地保持代碼...交易資源效率低下無關緊要特定情況下程序員錯誤的可能性較小。
我知道您希望批量保存數據,並且如果批處理整體不成功,則保存單個值沒有用。
由於資源不是瓶頸而且這是一個專用系統,因此上下文相對較長並不重要,因此我將每批使用一個上下文。 上下文收集數據並通過一個SaveChanges
調用結束每個批處理,這會自動將一個批處理保存在一個數據庫事務中。 粗略地說,代碼看起來像這樣:
do
{
// Start of a new batch.
using(var db = new MyContext())
{
// Collect data into the context
...
SaveChanges();
}
} while (....); // While there are new batches
數據庫連接將在需要時打開和關閉。 SaveChanges
將執行此操作,也可以執行您可能需要的任何其他數據庫交互。 EF永遠不會讓連接打開超過必要的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.