在长时间运行的进程中,DbContext 的生命周期问题

4
假设我有一个长时间运行的进程(例如Windows服务),需要从多个线程访问数据库。DbContext并不是线程安全的,而且保留它很长时间也不是一个好主意(在Web环境中创建每个请求的新上下文似乎是一种被接受的最佳实践)。根据EF文档,上下文被期望是短暂和丢弃的,因此已经被实现为非常轻量级并尽可能重用元数据,因此在这些情况下为每个数据库操作创建一个新的DB上下文似乎是一个可行的方法,但这似乎有点过度。你认为呢?

你能展示一些代码吗? - Sampath
@Sampath 目前还没有,正在决定最佳编写方式。 - Evgeni
1
长时间保留DbContext并不是一个好主意——可能会出现内存泄漏、溢出等问题,而且更改跟踪可能会带来奇怪的结果。根据需要创建和处理DbContext是一个相当不错的主意。 - Red
1
还有一个相关的问题,请参考:https://dev59.com/DW025IYBdhLWcg3wjGtO - Red
@raderick 谢谢你提供的链接,非常有用。 - Evgeni
1
“你有什么想法?”这句话几乎让这个问题被标记为过于宽泛。 - Jean-François Corbett
1个回答

0

确实是短期运行,但不仅因为数据库方面的考虑,还因为应用程序架构:如果您的架构符合Bob Martin的Clean Code标准,网站或Windows服务将不会了解数据库的任何信息,它们只会在需要时创建一个应用程序服务。 应用程序服务应负责控制数据库会话的生命周期和获取的所有数据。这对我非常有效。


1
一个应用程序为什么要了解数据库更多的信息,当上下文生命周期更长时?这只是将问题从上下文生命周期转移到应用程序服务生命周期。我认为上下文的寿命本身与关注点分离没有任何关系。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接