簡體   English   中英

如何使用Entity Framework處理長時間運行的操作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM