EF6,Windows服务&数据库轮询

时间:2014-04-01 06:48:31

标签: c# linq entity-framework windows-services polling

我有一个轮询数据库的Windows服务。我正在使用EF6和linq进行查询和更新等。

民意调查需要尽可能频繁,可能每2秒钟或该地区的某些事情。

我的直觉告诉我有一个连接,并在我的服务运行时保持打开,但是其他东西告诉我每次打开和关闭连接。我觉得后者会减慢它的速度(这真的会减慢它吗?)。

在Windows服务中轮询数据库时,最佳做法是什么?我应该经常对我的数据库进行轮询吗?

1 个答案:

答案 0 :(得分:3)

我认为您应该经常处理上下文,并在每次轮询数据库时创建一个新上下文。

主要原因是除非你禁用对象跟踪(实际上只适用于只读操作),否则随着时间的推移,上下文会变得越来越大,每次连续的轮询操作都会将更多数据加载到上下文的缓存中。除了导致内存增加外,SaveChanges()会变慢,因为ObjectContext随后会查找附加到它的对象的变化。

如果连接因任何原因丢失,您也很难将新连接与上下文相关联。无论如何,根据我自己的经验,它不会减慢任何速度,在第一个之后构建任何EF上下文对象都很快,因为模型在第一次加载时被缓存。

我不会担心每2秒进行一次民意调查。这对我来说似乎完全合情合理。

顺便说一句,如果您使用的是SQL Server,则可以使用Sql Dependency在数据更改时触发事件,但轮询是最可靠的选项。

http://msdn.microsoft.com/en-us/library/62xk7953(v=vs.110).aspx

或者,如果您已经设置了反对轮询,您可以查看使用像RabbitMQ这样的Message Broker系统并更新您的应用程序以使用它,但是要准备好在几周内实施基础架构。