代码之家  ›  专栏  ›  技术社区  ›  Johan

EF6,Windows服务和数据库轮询

  •  3
  • Johan  · 技术社区  · 10 年前

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

    投票需要尽可能频繁,可能每2秒或在该区域进行一次。

    我的直觉告诉我要有一个连接,并在我的服务运行时保持它打开,然而,其他一些告诉我每次都要打开和关闭连接。我觉得后者会让它慢下来(这真的会让它这么慢吗?)。

    在windows服务中轮询数据库时,最佳做法是什么?我真的应该如此频繁地轮询数据库吗?

    1 回复  |  直到 10 年前
        1
  •  4
  •   a-h    10 年前

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

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

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

    我不会担心每2秒进行一次投票。这对我来说似乎完全合理。

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

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

    或者,如果您坚决反对轮询,您可以考虑使用像RabbitMQ这样的MessageBroker系统,并更新应用程序以使用它,但要做好准备,在实施基础设施的几周内会损失一些时间。