.NET Framework SQL Server 数据提供程序连接池

建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用程序提供连接池。

您也可以提供几个连接字符串修饰符来控制连接池行为,请参见本主题内下文中“使用连接字符串关键字控制连接池”这一节。

池的创建和分配

当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与连接中的字符串相关联。每个连接池都与一个不同的连接字符串相关联。当新连接打开时,如果连接字符串不精确匹配现有池,则将创建一个新池。

在以下示例中,将创建三个新的 SqlConnection 对象,但只需要使用两个连接池来管理这些对象。请注意,第一个和第二个连接字符串的差异在于为 Initial Catalog 分配的值。

SqlConnection conn = new SqlConnection();conn.ConnectionString = “Integrated Security=SSPI;Initial Catalog=northwind”;conn.Open();   // Pool A is created.SqlConnection conn = new SqlConnection();conn.ConnectionString = “Integrated Security=SSPI;Initial Catalog=pubs”;conn.Open();   // Pool B is created because the connection strings differ.SqlConnection conn = new SqlConnection();conn.ConnectionString = “Integrated Security=SSPI;Initial Catalog=northwind”;conn.Open();   // The connection string matches pool A.

连接池一旦创建,直到活动进程终止时才会被毁坏。非活动或空池的维护只需要最少的系统开销。

连接的添加

连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接将根据需要添加到池中,直至达到最大池大小。

当请求 SqlConnection 对象时,如果存在可用的连接,则将从池中获取该对象。若要成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上下文相关联,并且具有与服务器的有效链接。

如果已达到最大池大小且不存在可用的连接,则该请求将会排队。当连接被释放回池中时,连接池管理程序通过重新分配连接来满足这些请求。对 Connection 调用 Close 或 Dispose 时,连接被释放回池中。

警告 建议使用完 Connection 后始终将其关闭,以便连接可以返回到池中。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。不是显式关闭的连接可能不会添加或返回到池中。例如,如果连接已超出范围但没有显式关闭,则仅当达到最大池大小而该连接仍然有效时,该连接才会返回到连接池中。

注意 不要在类的 Finalize 方法中对 Connection、DataReader 或任何其他托管对象调用 Close 或 Dispose。在终结器中,仅释放类直接拥有的非托管资源。如果类不拥有任何非托管资源,则不要在类定义中包含 Finalize 方法。有关更多信息,请参见垃圾回收编程

连接的移除

如果连接生存期已过期,或者连接池管理程序检测到与服务器的连接已断开,连接池管理程序将从池中移除该连接。请注意,只有在尝试与服务器进行通信后,才可以检测到这种情况。如果发现某连接不再连接到服务器,则会将其标记为无效。连接池管理程序会定期扫描连接池,查找已释放到池中并标记为无效的对象。找到后,这些连接将被永久移除。

如果存在与已消失的服务器的连接,那么即使连接池管理程序未检测到已断开的连接并将其标记为无效,仍有可能将此连接从池中取出。当发生这种情况时,将生成异常。但是,为了将该连接释放回池中,仍必须将其关闭。

青泥AI 青泥AI

青泥学术AI写作辅助平台

青泥AI 302 查看详情 青泥AI

事务支持

连接是根据事务上下文来从池中取出并进行分配的。请求线程和所分配的连接的上下文必须匹配。因此,每个连接池实际上又分为不具有关联事务上下文的连接以及 N 个各自包含与一个特定事务上下文的连接的子部分。

当连接关闭时,它将被释放回池中,并根据其事务上下文放入相应的子部分。因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成错误。这样,您就可以在随后提交或中止分布式事务。

使用连接字符串关键字控制连接池

SqlConnection 对象的 ConnectionString 属性支持连接字符串键/值对,这些键/值对可用于调整连接池逻辑的行为。

下表描述了可用于调整连接池行为的 ConnectionString 值。

连接池的性能计数器

SQL Server .NET Framework 数据提供程序添加了几个性能计数器,它们将使您能够微调连接池特性,检测与失败的连接尝试相关的间歇性问题,并检测与对 SQL Server 的超时请求相关的问题。

下表列出了可以在“.NET CLR 数据”性能对象下的“性能监视器”中访问的连接池计数器。

注意 将 SQL Server .NET Framework 数据提供程序性能计数器与 ASP.NET 应用程序一起使用时,只有 _Global 实例是可用的。因此,性能计数器返回的值是所有 ASP.NET 应用程序的计数器值的总和。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1082896.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 20:04:31
下一篇 2025年12月2日 20:06:15

相关推荐

  • 如何在Flask中从HTML按钮获取变量值

    本教程详细讲解了如何在flask应用中,通过html表单的post请求,安全有效地从按钮(或其他表单元素)获取动态变量值。我们将重点介绍html ` POST 请求: 立即学习“前端免费学习笔记(深入)”; 特点: 数据放在HTTP请求体中,不会显示在URL中,因此更适合发送敏感信息(如密码)或大量…

    2025年12月23日
    000
  • html怎样重定向连接

    这次给大家带来html怎样重定向连接,html重定向连接的注意事项有哪些,下面就是实战案例,一起来看一下。 代码如下: window.location.href=”zcbfH.jsp”;//在本框架中重定向 onclick=”top.mainFrame.location=’/login.jsp'”;…

    好文分享 2025年12月21日
    000
  • 在ASP.NET MVC中实现基于Chosen插件的3字符自动补全搜索

    本文旨在提供一个详细的教程,指导开发者如何在ASP.NET MVC应用程序中,结合Chosen.js插件,为大型下拉列表实现高效的3字符自动补全搜索功能。我们将涵盖从前端JavaScript事件监听、AJAX异步通信,到后端C#控制器数据处理的全栈实现细节,并提供最佳实践建议,以优化用户体验和系统性…

    好文分享 2025年12月21日
    000
  • 高效地将PostgreSQL jsonb数据传递到JavaScript

    本文旨在探讨如何高效地将PostgreSQL jsonb字段中已存在的JSON数据通过PHP传递到JavaScript,避免不必要的重复编码和解析。核心方法是在PHP中直接拼接从数据库获取的JSON字符串,构建成一个完整的JSON数组字符串,然后将其传递给JavaScript进行一次性解析,从而优化…

    2025年12月20日
    100
  • C++如何进行数据库操作_使用SQLiteCpp库在C++中轻松管理SQLite数据库

    SQLiteCpp简化C++中SQLite操作,需先安装libsqlite3-dev并编译SQLiteCpp库,通过包含头文件使用;用SQLite::Database创建或打开数据库,结合RAII与异常处理确保安全;利用exec()执行建表等DDL语句,通过SQLite::Statement预编译实…

    2025年12月19日
    000
  • c++怎么连接和使用SQLite数据库_c++ SQLite数据库连接与操作示例

    首先通过包含sqlite3.h和sqlite3.c在C++中连接SQLite,接着用sqlite3_open创建数据库,再使用sqlite3_exec执行建表、插入等操作,然后通过回调函数处理查询结果,推荐使用sqlite3_prepare_v2和绑定参数进行安全的预编译语句操作,最后正确释放资源完…

    2025年12月19日
    000
  • 查询以更新的矩阵中连接的非空单元格的数量

    矩阵可以被认为是按行和列组织的单元格的集合。每个单元格可以包含一个值,该值可以为空或非空。在计算机编程中,矩阵通常用于表示二维网格中的数据。 在本文中,我们将讨论如何有效地计算矩阵中连接的非空单元格的数量,同时考虑到矩阵可能的更新。我们将探索解决此问题的不同方法,并提供真实的代码示例来演示实现。 语…

    2025年12月17日
    000
  • .net framework有什么用

    .net framework有什么用 .net framework是Microsoft.NET程序的开发框架的运行库,也就是说如果你运行的程序是用.net开发的,就需要Framework作为底层运行环境。 推荐学习:编程入门。 .net framework是微软的开发程序的框架 .net技术是比较新…

    2025年12月17日
    000
  • XSLT扩展函数如何编写?

    XSLT扩展函数通过外部代码(如Java、C#)增强XSLT处理能力,解决其在数据库操作、复杂计算、文件交互等方面的局限。以Java为例,需编写包含静态方法的类,将其置于classpath,并在XSLT中通过xmlns:prefix=”java:package.Class”声…

    2025年12月17日
    000
  • XQuery与SQL有何异同?

    XQuery专精于处理XML半结构化数据,适用于层次复杂、结构多变的场景,如Web服务、配置文件和数据转换;SQL则擅长管理高度结构化的二维表数据,适用于需强一致性与事务支持的业务系统。两者数据模型根本不同:SQL基于关系代数,强调表、行、列的刚性结构;XQuery基于XDM节点树模型,通过XPat…

    2025年12月17日
    000
  • python包和模块的内容整理

    模块是包含Python代码的文件,包是包含多个模块的目录,通过__init__.py识别;使用import导入模块,from…import导入函数;包内可用相对或绝对导入,建议用绝对导入并合理命名,以提升项目结构清晰度与可维护性。 Python 中的包(Package)和模块(Modul…

    2025年12月14日
    000
  • python psutil库有何用法?

    psutil 是跨平台 Python 库,用于监控系统资源,支持获取 CPU 使用率(psutil.cpu_percent(interval=1))、核心数(cpu_count)、CPU 时间(cpu_times);内存方面提供物理内存(virtual_memory)和交换分区(swap_memor…

    2025年12月14日
    000
  • Python 解释器的几种常见实现

    CPython是官方标准实现,用C编写,支持广泛但多线程受GIL限制;2. Jython将Python编译为Java字节码,适用于JVM平台并可调用Java库,但不支持C扩展且版本更新慢;3. IronPython运行在.NET平台,支持与C#交互,适合Windows和.NET集成,同样不兼容多数C…

    2025年12月14日
    000
  • Matplotlib SVG 文件添加元数据注释:使用 metadata 参数

    Matplotlib 允许用户在保存 SVG 文件时嵌入元数据注释。本文将详细介绍如何利用 plt.savefig 函数的 metadata 参数,遵循 Dublin Core 标准,为 SVG 图形文件添加创建者(Creator)等信息,从而有效记录文件来源和上下文,提升文件可追溯性。 1. 为什…

    2025年12月14日
    000
  • python中GIL的原理

    GIL是CPython为简化内存管理而引入的互斥锁,确保同一时刻仅一个线程执行字节码。由于CPython使用引用计数,需保证其增减的原子性,故通过GIL避免多线程竞争。在Python 3.2后,GIL采用抢占机制,持有超过5毫秒会主动释放,I/O或C扩展时也会释放以提升并发效率。GIL主要影响CPU…

    2025年12月14日
    000
  • 获取最新会议论文数据的OpenReview API与替代方案

    本文旨在提供一套全面的指南,教授如何利用OpenReview API获取学术会议(特别是2023年及以后)的论文标题和其他相关数据。鉴于API版本迭代,我们将重点介绍如何使用`openreview.api.OpenReviewClient`及其新的`baseurl`以访问最新数据。同时,针对部分会议…

    2025年12月14日
    000
  • CCXT fetch_ohlcv 最新数据缺失:时区问题的深度解析与解决方案

    在使用CCXT的`fetch_ohlcv`方法获取K线数据时,用户常遇到无法获取最新几小时数据的问题。这通常是由于将本地时间而非UTC时间作为`since`参数传入所致。CCXT及其底层交易所API普遍采用UTC时间戳。本文将深入探讨这一时区差异问题,并提供确保正确获取最新历史K线数据的解决方案和最…

    2025年12月14日
    000
  • python有哪些编译器

    答案是Python的“编译器”通常指不同实现或工具:CPython将源码编译为字节码并解释执行;PyPy通过JIT提升性能;Jython在JVM上运行;IronPython集成.NET;Cython生成C扩展;Nuitka编译为可执行文件;mypyc优化类型化代码。 Python 本身是一种解释型语…

    2025年12月14日
    000
  • CCXT fetch_ohlcv数据获取:时区处理与最新K线完整性指南

    使用ccxt的`fetch_ohlcv`方法获取最新ohlcv数据时,用户常遇到数据缺失,尤其是在请求特定时间范围时。这通常是由于未正确处理时区造成的。ccxt默认处理utc时间戳,而用户可能传入了本地化时间。本文将深入探讨这一常见问题,提供正确的时区处理策略和代码示例,确保您能准确无误地获取到最新…

    2025年12月14日
    000
  • PyMongo连接MongoDB Atlas认证失败:深度排查与解决方案

    本文详细探讨了使用pymongo连接mongodb atlas时常见的认证失败问题,特别是`bad auth`错误。文章将指导用户系统性地检查连接字符串、ip白名单和数据库用户权限。重点强调,在所有配置看似正确的情况下,创建新的数据库用户账户往往是解决此类顽固认证问题的有效且直接的方案,避免不必要的…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信