c# - 在 Windows 服务的 OnStop 中调用字段的 Dispose 方法
问题描述
我开发了一个使用数据库连接的 Windows 服务。
我创建了以下字段:
private MyDBEntities _db;
在 OnStart 我有:
_db = new MyDBEntities();
然后服务完成它的工作。
在 OnStop 方法中,我有:
_db.Dispose();
_db = null;
这种方法有缺点吗?出于性能原因,我需要在服务运行时始终打开数据库(即 SQL Server)。
谢谢詹姆
解决方案
如果您的服务是访问此数据库的唯一应用程序,它不应该有任何性能下降。但是,在我看来,与数据库建立长期连接并不是最好的方法。想象一下,您没有将数据库保存在服务器上,而是使用了一些云提供商(Google、AWS、Azure)。使用云解决方案,您的服务器地址可能不是固定的,并且可能会随着时间而变化。在执行一个查询期间,IP 地址可能会发生变化(很可能,你会得到 SqlTransientException 或类似的,我不记得了)。
如果您的服务将是唯一一个访问数据库的应用程序,并且您将只有一个实例 - 那么这种方法在性能方面可能是有益的 - 因为您不必总是打开和关闭连接。但是,您必须记住,使用这种方法可能会出现许多其他问题(您可能必须从陈旧的连接重新连接,连接到其他副本实例,或者因为我目前没有考虑的事情而破坏现有连接)。此外,请记住如果您不能正确开发这种方法,多线程问题很可能会出现。
恕我直言-您应该始终在需要时打开与数据库的连接,并在使用后立即关闭。您将避免我之前提到的大多数问题。
推荐阅读
- pdf - 如何使用ghostscript检查pdf是否已经转换为pdf/a?
- sql-server - 安装了 SQLENGINE 的 SQL2019 显示 4 个新系统文件,但 SSMS 中没有新系统数据库
- javascript - 类型错误:这是未定义的“反应”
- c++ - 初始化具有显式大小的数组是否需要 constexpr 大小?
- android - 新的 pubspec Flutter 插件声明导致 MissingPluginException
- javascript - Nuxt mixin - 属性或方法未在实例上定义,但在渲染期间引用
- javascript - 如何在单击事件期间禁用自动滚动到顶部
- perl - 我如何翻转 ord('a') 的位
- c - 使用 MKL 库创建随机矩阵
- c++ - 函数在 Lib 中不可用