繁体   English   中英

EF6,Windows服务和数据库轮询

[英]EF6, Windows Service & Database polling

我有一个轮询数据库的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系统并更新您的应用程序以使用它,但是准备在部署基础架构的过程中损失几周的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM