每次操作后关闭访问数据库是不是更好,保持打开以供以后操作

Posted

技术标签:

【中文标题】每次操作后关闭访问数据库是不是更好,保持打开以供以后操作【英文标题】:Is it better to better to close the access DB after every operation of keep it open for later operations每次操作后关闭访问数据库是否更好,保持打开以供以后操作 【发布时间】:2010-11-05 05:48:54 【问题描述】:

我正在开发一个从 Access DB 文件中获取数据的 VB.NET 项目。我遇到的所有代码片段都打开数据库,做一些事情并为每个操作关闭它。我目前在应用程序运行的整个过程中都打开了数据库,并且只有在应用程序退出时才关闭它。

我的问题是:为每个操作打开与数据库文件的连接而不是在应用程序运行期间保持打开状态是否有好处?

【问题讨论】:

【参考方案1】:

在许多数据库系统中,只有在使用时才保持连接打开是一种很好的做法,因为打开的连接会消耗数据库中的资源。对于您的代码而言,尽可能少地了解正在使用的具体数据库也被认为是一种很好的做法(例如,通过针对诸如 IDbConnection 之类的接口进行编程,而不是针对诸如 OleDbConnection 之类的具体类型进行编程。

出于这个原因,遵循尽可能少地保持连接打开的做法可能是一个好主意无论这对您使用的特定数据库是否有意义。它只是使您的代码更易于移植,并且增加了不出错的机会,以防您在下一个项目中碰巧在一个保持连接打开是一件坏事的系统上工作。

所以,你的问题应该反过来:保持连接打开有什么好处

【讨论】:

但是这种做法对于 Jet/ACE 来说是错误的,它在保持打开的单个持久连接的情况下效果更好。常规建议适用于服务器数据库,但 Jet/ACE 不是服务器数据库,使用单个持久连接性能更好。 关于最后一个问题,“保持连接打开有什么好处吗?”是的,当然——每次打开连接时创建 LDB 文件的成本非常高,尤其是在共享环境中。您会发现,正是出于这个原因,Access 开发人员经常使用持久连接作为性能提升器。【参考方案2】:

Jet/ACE 数据库引擎没有任何好处。创建 LDB 文件(记录锁定文件)的成本非常高。您也许可以通过独占打开文件(如果它是单个用户)来避免这种情况,但我的感觉是独占打开比打开多用户慢。

关于打开和关闭连接的建议是基于假设数据库服务器位于连接的另一端。如果您考虑它是如何工作的,那么打开和关闭连接的成本非常低,因为数据库守护程序已经打开了数据文件,并通过内存中的结构(也许在磁盘上——我真的不知道)处理动态锁定'不知道它是如何在任何特定的服务器数据库中实现的)一旦服务器启动并运行就已经存在。

使用 Jet/ACE,所有用户都在争夺两个文件,即数据文件和锁定文件,而设置这两个文件比创建与服务器数据库的新连接的增量成本要高得多。

现在,在您的目标是使用 Jet/ACE 数据存储实现高并发性的情况下,可能必须在这些因素之间进行权衡,并且您可能会通过更加吝啬您的连接来获得更高的并发性.但我想说,如果您使用 Jet/ACE 进入该领域,您可能应该首先考虑升级到基于服务器的后端,而不是浪费时间优化 Jet/ACE 以适应它不是的环境专为。

【讨论】:

以上是关于每次操作后关闭访问数据库是不是更好,保持打开以供以后操作的主要内容,如果未能解决你的问题,请参考以下文章

最佳实践:每次传输后保持 TCP/IP 连接打开还是关闭?

禁用 CICD 构建自动触发,但保持打开以供手动触发

一旦程序完成并在 1 次击键后关闭,是不是有办法让控制台窗口保持打开状态?

什么更有效的方法是保持fstream开放或每次需要使用时打开它?

关闭上下文管理器后保持适合文件的可访问性

保持下载的文件(缓存)以供下次应用程序打开