gpt4 book ai didi

vb.net - 为什么不推荐使用一个 Public OleDbConnection?解决错误: too many connections opened的替代方案

转载 作者:行者123 更新时间:2023-12-04 14:33:52 25 4
gpt4 key购买 nike

我必须使用另一个开发人员制作的项目。带有 Visual-Basic 代码的项目 Win-Form,MS-Access 作为 db 和一些 OleDbConnections。有一个错误:有时应用程序无法打开 OleDbConnection,因为在 db 上已达到最大连接数。我知道使用连接的最佳方法是:

Using cn As New OleDbConnction(s)
...
cn.Close()
End Using

但是在项目中,有许多类可以与数据库一起使用,并且在这些类中的许多类中都有具有“ friend ”可见性的 OleDbConnections,它们在不同的时间打开和关闭。出于这个原因,不可能将所有 OleDbConnections 放在一个 Using 构造中,并且很难找到“忘记”关闭其中一个 OleDbConnection 的操作。

一种可能的解决方案可能是仅使用一个唯一的公共(public) OleDbConnection,并在打开它之前检查它是否尚未打开。
但有人告诉我这是一个非常糟糕的做法。我想他告诉我这个关于表演的事情,但我不知道确切的。
你能告诉我为什么一个独特的公共(public) OleDbConnection 如此被弃用吗?
对我来说,你有一个“简单”的解决方案来解决我的问题吗?
谢谢,
皮莱吉

最佳答案

从您的描述中,我看到了一些可能导致您出现问题的问题:

  • 嵌套连接:
    您在彼此之间打开多个连接
  • 打开/释放连接太快:
    正如 David-W-Fenton 提到的,通过 Access ,每次打开/关闭单个连接时,都会创建/删除锁定文件。此操作非常慢,如果您在应用程序中快速打开/关闭数据库(执行大量原子查询),您可能会遇到此问题。

  • 调查和解决问题的几种可能方法:

    跟踪所有打开/关闭调用
    添加一些调试跟踪,在您每次打开和关闭连接时显示。
    它将允许您检测嵌套连接以及连接池被浪费的位置。

    强制连接轮询
    一个简单的“修复”可能是在连接字符串中明确设置连接池。它应该是默认行为,所以也许它不会做任何事情来解决你的问题,但它是如此简单,没有理由不尝试它:
    OLE DB Services=-1

    使用连接管理器类 为您创建/释放连接。
    用您自己的代码替换所有显式创建的新 OleDbConnection 和关闭操作。
    这将允许您始终在整个应用程序中重用单个现有连接,并允许您通过将行为集中在一个地方来快速调整整个应用程序。

    那么为什么通常不推荐使用单个连接呢?
  • 通常,您不应该在整个应用程序中保持连接打开,因为它们会强制数据库服务器为您保留可用资源,并且会减少可以连接的客户端数量(始终可用的连接数量是有限的)。
    但是对于 Access - 一个没有服务器部分的基于文件的数据库 - 保持单个连接打开实际上是更可取的,因为与打开新连接(创建锁定文件)相关的延迟。由于 Access 不适合与大量并发用户一起使用,因此保持连接打开的资源成本不足以成为问题。
    From simple tests ,可以看出,保持连接始终打开可以使后续连接的打开速度提高约 10 倍!
  • OleDb 驱动程序为您执行连接池,因此它能够在连接被释放时重新使用它们。
  • 通过保持您的连接和数据库操作较小且包含在内,您在使用线程时不太可能遇到并发问题。如果您使用同一个数据库管道执行多个操作,保持全局连接可能会成为一个问题。
  • 关于vb.net - 为什么不推荐使用一个 Public OleDbConnection?解决错误: too many connections opened的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6361947/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com