工作者角色中的实体框架 DbContext 生命周期
Entity Framework's DbContext Lifetime in Worker Role
我有工作者角色,每秒对数据库进行一些处理。
是否可以在 worker 启动时初始化 DbContext
并在 worker 的整个生命周期中使用它?
如何处理数据库连接?如果数据库脱机并重新联机怎么办?我还能使用上下文吗?
我的建议是为每个操作创建、使用和销毁上下文……不要坚持下去。
一开始我很担心,因为我不知道创建 DbContext 的成本有多高,答案是,不是很贵。
如果您尝试继续重复使用 DbContext 实例,您也会 运行 遇到问题(很快),因为它的内部状态模型将开始报告已加载对象版本的冲突(无论更新)以前
据我目前所知,主要的 DbContext
抽象是工作单元。
DbContext 在需要时打开和关闭数据库连接(即在 context.SaveChanges()
上),因此数据库连接与上下文的范围无关。
这样看,我现在认为要决定 DbContext
实例的范围应该是什么,您需要考虑您的工作单元及其在内存中管理的实体。
例如,这是我的问题,通常在 worker 的整个生命周期中使用单个上下文实例是没有意义的,因为:
通常您将在每个角色调用中处理不同的实体。在这种情况下,上下文无论如何都需要将这些实体加载到内存中。
随着时间的推移,上下文将管理内存中越来越多的实体,这将导致性能问题(因为它会扫描图形以寻找更改和要做的事情)并最终导致内存问题。
将实体长时间保存在内存中会增加上下文中的实体与数据库中的实际数据不一致的可能性。解决这些不一致可能会降低性能。
总而言之,在工作者角色的整个生命周期中使用同一个 DbContext
实例可能是错误的。
要决定 DbContext
的范围,请考虑您正在实施的工作单元。
我有工作者角色,每秒对数据库进行一些处理。
是否可以在 worker 启动时初始化 DbContext
并在 worker 的整个生命周期中使用它?
如何处理数据库连接?如果数据库脱机并重新联机怎么办?我还能使用上下文吗?
我的建议是为每个操作创建、使用和销毁上下文……不要坚持下去。 一开始我很担心,因为我不知道创建 DbContext 的成本有多高,答案是,不是很贵。
如果您尝试继续重复使用 DbContext 实例,您也会 运行 遇到问题(很快),因为它的内部状态模型将开始报告已加载对象版本的冲突(无论更新)以前
据我目前所知,主要的 DbContext
抽象是工作单元。
DbContext 在需要时打开和关闭数据库连接(即在 context.SaveChanges()
上),因此数据库连接与上下文的范围无关。
这样看,我现在认为要决定 DbContext
实例的范围应该是什么,您需要考虑您的工作单元及其在内存中管理的实体。
例如,这是我的问题,通常在 worker 的整个生命周期中使用单个上下文实例是没有意义的,因为:
通常您将在每个角色调用中处理不同的实体。在这种情况下,上下文无论如何都需要将这些实体加载到内存中。
随着时间的推移,上下文将管理内存中越来越多的实体,这将导致性能问题(因为它会扫描图形以寻找更改和要做的事情)并最终导致内存问题。
将实体长时间保存在内存中会增加上下文中的实体与数据库中的实际数据不一致的可能性。解决这些不一致可能会降低性能。
总而言之,在工作者角色的整个生命周期中使用同一个 DbContext
实例可能是错误的。
要决定 DbContext
的范围,请考虑您正在实施的工作单元。