我有一个正在轮询数据库的 Windows 服务。我正在使用 EF6 和 linq 进行查询和更新等。
轮询需要尽可能频繁,可能每 2 秒一次或在那个区域进行一次。
我的直觉告诉我要有一个连接并在我的服务运行时保持它打开,但是另一件事告诉我每次都打开和关闭连接。我觉得后者会减慢它的速度(这真的会减慢它的速度吗?)。
在 Windows 服务中轮询数据库时,最佳实践是什么?我真的应该如此频繁地轮询我的数据库吗?
最佳答案
我认为您应该经常处理上下文并在每次轮询数据库时创建一个新上下文。
主要原因是,除非您禁用对象跟踪(实际上只适用于只读操作),否则上下文会随着时间的推移变得越来越大,每个连续的轮询操作都会将更多数据加载到上下文的缓存中。除了这会导致内存增加外,SaveChanges() 也会变慢,因为 ObjectContext 然后会查找附加到它的对象中的更改。
如果连接因任何原因丢失,您也将很难将新连接与上下文相关联。无论如何,根据我自己的经验,它不会减慢任何速度,它会在第一个 EF 上下文对象之后快速构建任何 EF 上下文对象,因为模型在第一次加载时被缓存。
我不会担心每 2 秒进行一次轮询。这对我来说似乎完全合理。
顺便说一句,如果您使用的是 SQL Server,则可以使用 Sql Dependency 在数据更改时触发事件,但轮询是最可靠的选择。
http://msdn.microsoft.com/en-us/library/62xk7953(v=vs.110).aspx
或者,如果您坚决反对轮询,您可以考虑使用 RabbitMQ 之类的 Message Broker 系统并更新您的应用程序以使用它,但要准备好失去数周的基础设施实现时间。
关于c# - EF6、Windows 服务和数据库轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22778717/