在 Windows 服务的 OnStop 中调用字段的 Dispose 方法

Calling Dispose method of a field in OnStop of a Windows service

我开发了一个使用数据库连接的 Windows 服务。

我创建了以下字段:

private MyDBEntities _db;

在 OnStart 中我有:

_db = new MyDBEntities();

然后服务开始工作。

在 OnStop 方法中我有:

_db.Dispose();
_db = null;

这种方法有缺点吗?由于性能原因,我需要一直打开数据库(即 SQL 服务器),而服务是 运行.

谢谢 海梅

如果您的服务是唯一访问此数据库的应用程序,它应该不会有任何性能下降。但是,在我看来,与数据库建立长期连接并不是最好的方法。想象这样一种情况,您没有将数据库保存在服务器上,而是使用了一些云提供商(Google、AWS、Azure)。使用云解决方案,您的服务器地址可能不是固定的,并且可能会随时间变化。 IP 地址可能会在一个查询的执行过程中发生变化(很可能,您会得到 SqlTransientException 或类似的异常,我不记得了)。

如果您的服务将是唯一一个访问数据库的应用程序,并且您只有它的一个实例 - 那么这种方法在性能方面可能是有益的 - 因为您不必打开和关闭始终连接。但是,您必须记住,使用这种方法,可能会出现许多其他问题(您可能必须从失效连接重新连接、连接到其他副本实例,或者因为我目前没有考虑的事情而破坏现有连接)。此外,请记住如果您不正确地开发这种方法,很可能会出现多线程问题。

恕我直言 - 您应该始终在需要时打开与数据库的连接,并在使用后立即关闭。您将避免我之前提到的大部分问题。

拥有单例上下文会导致线程锁定 SaveChanges()(降低性能)。

此外,每个事件(我假设 运行 是异步的)可能会保存一些导致意外行为的其他事件信息。

正如有人已经指出的那样,您可以使用连接池来避免连接问题并在每个 request/event 触发时处理上下文。