在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

猜你喜欢

转载自www.cnblogs.com/liuslayer/p/11458294.html