我有一个轮询数据库的Windows服务。我正在使用EF6和linq进行查询和更新等。
轮询需要尽可能频繁,大概每2秒或在该区域进行一次轮询。
我的直觉告诉我建立一个连接,并在我的服务运行时保持连接打开,但是其他原因告诉我每次都打开和关闭连接。我觉得后者会减慢它的速度(这真的会减慢这么多吗?)。
在Windows服务中轮询数据库时,最佳做法是什么?我真的应该经常轮询数据库吗?
我认为您应该经常处理上下文,并在每次轮询数据库时创建一个新的上下文。
主要原因是,除非禁用对象跟踪(确实仅适用于只读操作),否则上下文会随着时间的流逝而变得越来越大,每个后续的轮询操作会将更多数据加载到上下文的缓存中。除了这导致的内存增加之外,SaveChanges()也会变慢,因为ObjectContext然后会寻找附加到它的对象中的更改。
如果由于某种原因失去了连接,那么将新连接与上下文相关联将很困难。无论如何,根据我自己的经验,它不会降低速度,它会在第一个EF上下文对象之后快速构建任何EF上下文对象,因为该模型是在第一次加载时进行缓存的。
我不会担心每2秒进行一次轮询。对我来说,这似乎是完全合理的。
顺便说一句,如果您使用的是SQL Server,则可以使用Sql Dependency在数据更改时触发事件,但是轮询是最可靠的选择。
http://msdn.microsoft.com/zh-CN/library/62xk7953(v=vs.110).aspx
另外,如果您对轮询一无所知,可以考虑使用RabbitMQ之类的Message Broker系统并更新您的应用程序以使用它,但是准备花费几周的时间来实施基础结构。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句