在entity framework中,DbContext是否需要手動Dispose ?


  • 問題

  • 如題,版本為6.0的entity framework,是否需要手動Dispose DbContext對象?

    我們公司做的項目自從改用using去dispose DbContext后,性能有明顯的【下降】(但不確定是否是因為釋放dbcontext導致)!

    之前在網上看到資料說,不需要手動釋放DbContext:

    http://stackoverflow.com/questions/15666824/entity-framework-and-context-dispose

    http://www.cnblogs.com/mecity/archive/2011/07/17/2108508.html

     

     

    如果entity framework內部使用線程池的話,是否關閉DbContext反而會影響性能嗎?不知實際情況如何,請大神賜教,

    如果真的不需要Dispose的話,那么DbContext實現IDisposable接口的意義何在?

     

    • 已編輯 jesse hao 2015年1月13日 9:39
    2015年1月13日 9:33
    jesse hao 的頭像
     
    30 分數
     

答案

  • 你好:

    根據我的經驗,第一個和第二個問題的答案都是A,這個問題比較容易驗證,你打開Sql Profiler,調試一下代碼就知道了。

    第三個問題我不太好回答,沒有驗證過,但理論上講應該會有一些影響,DbContext對象的創建和銷毀是要消耗資源的。

    第四個問題應該不會出現這種情況,除非你執行的是比較耗時的操作,在執行階段會占用數據庫連接。ObjectContext.Connection.State屬性可以檢查連接狀態(EF5有BUG,EF6沒有問題,參考這里),也可以通過查看Sql Profiler來判斷。

    另外我建議你遇到問題的時候嘗試查看一下EF的源碼,有些疑問通過源碼就可以得出結論:https://entityframework.codeplex.com/SourceControl/latest

     


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place. 
    Click HERE to participate the survey.

    • 已標記為答案 jesse hao 2015年1月15日 8:04
    2015年1月15日 6:57
    Caillen 的頭像
     
    27,835 分數
     

全部回復

  • 你好:

    據我所知,對於DbCoontext不需要主動去調用Dispose方法或者使用using關鍵字。它會自動管理數據庫的連接,在需要用到的時候自動打開,不需要的時候會自動關閉,但是數據庫連接資源何時被回收可能取決於GC。我猜測實現IDisposable接口的意義就在於給用戶提供一個立即銷毀資源並讓GC回收垃圾的機制。

    參考一下鏈接:

    http://social.technet.microsoft.com/wiki/contents/articles/3739.entity-framework-faq-objectcontext.aspx#Do_I_need_to_explicitly_call_Dispose_on_the_ObjectContext_object_after_use

    我覺得添加Dispose和沒有添加Dispose應該性能上沒有什么差別,最好通過代碼和大量的數據測試一下,找出問題的根本原因。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place. 
    Click HERE to participate the survey.

    2015年1月14日 5:22
    Caillen 的頭像
     
    27,835 分數
     
  • 您好,多謝您的回答,我還有些疑問,請您為我釋疑:


    1.DbContext與數據庫會在什么時候建立連接?
    A:執行SQL語句時(比如ToList或SaveChanges時),
    B:創建DbContext時(但尚未執行SQL語句),
    C:其他:


    2.DbContext與數據庫什么時候斷開連接?
    A:當SQL語句執行完畢時(比如執行完ToList或SaveChanges時),
    B:手動調用Dispose或GC清理DbContext時,
    C:其他:


    3.如果DbContext內部使用的連接池的話,那手動Dispose掉DbContext,是否會影響性能(使性能下降)?因為關閉連接池中的連接后,其他線程使用連接池就要重新與數據庫建立連接了,


    4.如果未關閉連接的話,是否會長時間占用連接池中的連接,從而使其他線程無法與數據庫建立連接?因為我們的項目連接數據庫時,偶爾出現【與SQL數據庫建立連接時超時】的異常,


    再次感謝您的回答!
    2015年1月15日 6:06
    jesse hao 的頭像
     
    30 分數
     
  • 你好:

    根據我的經驗,第一個和第二個問題的答案都是A,這個問題比較容易驗證,你打開Sql Profiler,調試一下代碼就知道了。

    第三個問題我不太好回答,沒有驗證過,但理論上講應該會有一些影響,DbContext對象的創建和銷毀是要消耗資源的。

    第四個問題應該不會出現這種情況,除非你執行的是比較耗時的操作,在執行階段會占用數據庫連接。ObjectContext.Connection.State屬性可以檢查連接狀態(EF5有BUG,EF6沒有問題,參考這里),也可以通過查看Sql Profiler來判斷。

    另外我建議你遇到問題的時候嘗試查看一下EF的源碼,有些疑問通過源碼就可以得出結論:https://entityframework.codeplex.com/SourceControl/latest


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM