我的工作角色每秒都会对数据库起作用。
在工作人员启动时初始化DbContext
并在工作人员的整个生命周期内使用它是否可以?
如何处理数据库连接?如果数据库脱机并重新联机怎么办?我仍然可以使用上下文吗?
答案 0 :(得分:2)
我的建议是为每个操作创建,使用和销毁上下文......不要挂在上面。 起初我常担心,因为我不知道创建DbContext有多昂贵,答案是,不是很好。
如果你试图继续重复使用DbContext实例,你也会遇到问题(很快),因为它的内部状态模型将开始报告先前加载(更新)的对象版本的冲突
答案 1 :(得分:2)
据我所知,主要的DbContext
抽象是工作单元。
DbContext在需要时(即context.SaveChanges()
)打开并关闭数据库连接,因此数据库连接与上下文的范围无关。
通过这种方式,我现在认为,要确定DbContext
实例的范围,您需要考虑您的工作单元及其在内存中管理的实体。
例如,我的问题是,通常在工作生命周期内使用单个上下文实例是没有意义的,因为:
通常,您将在每个角色调用中处理不同的实体。在这种情况下,上下文无论如何都需要将这些实体加载到内存中。
超时,上下文将管理内存中越来越多的实体,这会导致性能问题(因为它会扫描图表以查找更改和要做的事情)并最终导致内存问题。
长时间将实体保留在内存中会增加上下文中的实体与db中的实际数据之间出现不一致的可能性。解决这些不一致可能会降低性能。
总而言之,在worker角色的整个生命周期中使用相同的DbContext
实例可能是错误的。
根据您正在实施的工作单位决定DbContext
思考的范围。