Я думаю, вы должны часто использовать контекст и создавать новый каждый раз при опросе базы данных.
Основная причина заключается в том, что, если вы не отключите отслеживание объектов (это действительно подходит только для работы только для чтения), контекст становится все больше и больше с течением времени, при этом каждая последующая операция опроса загружает больше данных в кэш контекста. Как и увеличение памяти, это приводит к тому, что SaveChanges() замедляется, так как ObjectContext ищет изменения в объектах, которые к нему привязаны.
Если соединение по какой-либо причине потеряно, вам также будет сложно связать новое соединение с контекстом. Независимо от того, основываясь на моем собственном опыте, он ничего не замедлит, быстро построить любые объекты контекста EF после первого, потому что модель кэшируется при первой загрузке.
Я бы не стал беспокоиться о каждом опросе каждые 2 секунды. Это кажется мне вполне разумным.
В качестве альтернативы, если вы используете SQL Server, вы можете использовать Sql Dependency для запуска события при изменении данных, но опрос является наиболее надежным вариантом.
http://msdn.microsoft.com/en-us/library/62xk7953(v=vs.110).aspx
В качестве альтернативы, если вы решительно настроены против опроса, вы можете посмотреть на использование системы Message Broker, как RabbitMQ и обновление ваших приложений, чтобы использовать его, но будьте готовы потерять пару недель, содействующих выполнению инфраструктуры.
Спасибо, что указали мне на SQL Dependency, это действительно очень полезно. Не могли бы вы рассказать о том, почему он не является надежным? Также вы использовали его с Entity Framework? – Johan
Я видел экземпляры в производстве, где соединение SQL Dependency было потеряно и события не были запущены. Это немного похоже на FileSystemWatcher в том, что стоит подкрепить его менее частым опросом и часто обновлять зависимость/наблюдателя SQL. Я не использовал его с Entity Framework. Если вы пишете службу Windows или что-то в этом роде, она, скорее всего, будет отсутствовать в течение нескольких месяцев, а иногда никто не замечает, если она перестанет работать (т. Е. Сервис не «остановился», но он тоже ничего не делает!), поэтому я хотел бы охватить все базы. –