频繁打开数据库连接是否影响性能的疑惑

2023-10-27

之前写了很多数据库开发方面的程序,有的时候需要连续操作数据库,就在想这么密集去操作数据库会不会大量消耗资源,因为垃圾回收机制并不是马上执行。于是,特意了解了一下情况。

其实,数据库连接并不是托管资源,所以垃圾回收管不到它。另外Stream (文件流),COM (组件),Socket等这些都是非托管的资源。

正统的数据库Oracle,Sql Server,MySql等,都提供了一中连接池的机制来处理这种状况。下面就来了解一下这个神秘的连接池。

连接到数据库服务器通常由几个需要很长时间的步骤组成。必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信息,必须由服务器对连接进行身份验证,必须运行检查以便在当前事务中登记,等等。

实际上,大多数应用程序仅使用一个或几个不同的连接配置。这意味着在执行应用程序期间,许多相同的连接将反复地打开和关闭。为了使打开连接花费的系统开销最小,ADO.NET 使用称为连接池的优化方法。

连接池使新连接必须打开的次数得以减少。池进程保持物理连接的所有权。通过为每个给定的连接配置保留一组活动连接来管理连接。每当用户在连接上调用Open 时,池进程就会查找池中可用的连接。如果某个池连接可用,会将该连接返回给调用者,而不是打开新连接。应用程序在该连接上调用Close 时,池进程会将连接返回到活动连接池集中,而不是关闭连接。连接返回到池中之后,即可在下一个Open 调用中重复使用。

只有配置相同的连接可以建立池连接。ADO.NET 同时保留多个池,每种配置各一个。在使用集成的安全性时,连接按照连接字符串以及 Windows 标识分到多个池中。还根据连接是否已在事务中登记来建立池连接。

池连接可以显著提高应用程序的性能和可缩放性。默认情况下,在 ADO.NET 中启用连接池。除非显式禁用,否则,在应用程序中打开和关闭连接时,池进程会对连接进行优化。还可以提供几个连接字符串修饰符来控制连接池的行为。有关更多信息,请参见本主题后面的“使用连接字符串关键字控制连接池”。

------------------------------------------------------------------------------------------

在初次打开连接时,将根据完全匹配算法创建连接池,该算法将池与连接中的连接字符串关联。每个连接池都与一个不同的连接字符串相关联。打开新连接时,如果连接字符串并非与现有池完全匹配,将创建一个新池。按进程、应用程序域、连接字符串以及 Windows 标识(在使用集成的安全性时)来建立池连接。连接字符串还必须是完全匹配的;按不同顺序为同一连接提供的关键字将分到单独的池中。

在以下 C# 示例中创建了三个新的SqlConnection 对象,但是管理时只需要两个连接池。注意,根据为Initial Catalog 分配的值,第一个和第二个连接字符串有所不同。

using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// 创建连接池A
}

using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=pubs"))
{
connection.Open();
// 创建连接池B,因为连接字符串不同
}

using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind"))
{
connection.Open();
// 使用连接池A,因为连接字符串与连接池A相同
}

 如果 MinPoolSize 在连接字符串中未指定或指定为零,池中的连接将在一段时间不活动后关闭。但是,如果指定的MinPoolSize 大于零,在AppDomain 被卸载并且进程结束之前,连接池不会被破坏。非活动或空池的维护只需要最少的系统开销。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

频繁打开数据库连接是否影响性能的疑惑 的相关文章

随机推荐

  • ST-LINK烧录stm32程序步骤

    此篇文章记录下STM32使用ST LINK烧录程序的步骤 好兄弟 给个关注呗 材料 ST LINK驱动安装 点我下载st link驱动 提取码 4aw1 安装包有详细教程 stm32f103c8t6 ST LINK 杜邦线 keil5配置
  • vscode搭建esp32(避坑小窍门)

    这里写自定义目录标题 1 编译过程出现 终端将被任务重用 按任意键关闭 错误 可能的解决办法 1 在 终端 配置任务 PlatformIO Test 以Test工程名为例 打开tasks json文件 2 添加 presentation e
  • 02-离散仿真引擎基础

    Homework02 简答题 1 解释游戏对象 GameObjects 和资源 Assets 的区别与联系 区别 游戏对象是具有一定属性与功能的类的实体化 对应为Unity中具有对应职能与属性的组件 例如游戏中常见的玩家 怪物等 资源是预先
  • react 引入antd 样式_引用Ant.Design到React中

    参考地址 http ant design index cn ant design 首先说说ant design是干啥的 ant design是基于react开发的一个解放ui和前端的工具 它提供了一致的设计方便我们快速开发和减少不必要的设计
  • CocosCreator自动化绑定jsb

    与之前的cocos2dx js自定义js binding不同 这次用的是Cocos2dx里的自动绑定技术 更加的简单 高效 规整以及方便得多 而且之前的手动写文件不能适应更新后的CocosCreator版本的情况 环境配置 JDK NDK
  • 【H∞控制】H无穷控制器的matlab仿真

    1 软件版本 matlab2017b 2 系统概述 PID控制器 PID控制器 比例 积分 微分控制器 由比例单元 P 积分单元 I 和微分单元 D 组成 通过Kp Ki和Kd三个参数的设定 PID控制器主要适用于基本线性和动态特性不随时间
  • Java ffmpeg视频抽帧/转换遇到问题及解决

    Java 视频转换可能会遇到的问题及解决 很多报错都是没有引入 正确的依赖或者版本的问题 javacv版本及ffmpeg版本 1 正确的依赖
  • 狂神说Java--Docker(通俗易懂)

    目录 Docker的入门 Docker的概述 Docker的历史 Docker的用途 Docker的安装 Docker的基本组成 Docker安装 安装 阿里云镜像加速 登录阿里云找到容器服务 找到镜像加速器 配置使用 回顾HelloWor
  • html实现上下三角,css3实现三角形(上下左右)【转载】

    1 向上 kailong width 0 height 0 border right 50pxsolid transparent border left 50pxsolid transparent border bottom 50pxsol
  • Python实现进程管理

    Python实现进程管理 进程管理是操作系统中的重要组成部分 它负责创建 调度和终止进程 以及提供进程间通信和同步的机制 在Python中 我们可以使用多个库和模块来实现进程管理的功能 本文将介绍Python中几个常用的进程管理模块 并提供
  • pytorch打印模型参数

    目录 torchsummary打印 打印模型参数 两种方法结果好像是一样的 打印模型通道均值 获取按通道均值的排序top3索引
  • Sql Server 行转列

    SQL Server 行转列 聚合函数的选择 http www cnblogs com wlsandwho p 4423956 html 摘自网络 PIVOT用于将列值旋转为列名 即行转列 在SQL Server 2000可以用聚合函数配合
  • Token 刷新并发处理解决方案

    对 Token 进行刷新续期 我们要解决并发请求导致重复刷新 Token 的问题 这也是设计刷新 Token 的难点 这里我会分别介绍前端和后端各自的处理方案 后端方案 利用 Redis 缓存 当同时发起多个请求时 第一个接口刷新了 Tok
  • 【毕业设计】基于Spark的海量新闻文本聚类(新闻分类)

    文章目录 0 前言 1 项目介绍 2 实现流程 3 开发环境 4 java目录功能介绍 5 scala目录功能介绍 5 1 求TF IDF 5 2 调用K means模型 5 3 评价方式 6 聚类结果 7 最后 0 前言 Hi 大家好 这
  • undo表空间recover状态的(无备份)故障处理

    故障概述 今天项目上其他公司的运维人员找我说某数据库好像归档满了 并且他直接rman删了3天前的所有归档 然后发现二节点是宕机的 启动二节点数据库后发现2节点undo数据文件需要recover 这个数据库没有备份 万幸的是 需要recove
  • 浅谈压缩感知(二):理论基础

    主要内容 信号的稀疏表示 编码测量 采样过程 恢复算法 非线性 一 信号与图像的稀疏表示 在DSP 数字信号处理 中 有个很重要的概念 变换域 某个线性空间 一组基函数支撑起来的空间 一般而言 我们的信号都是在时域或空域中来表示 其实我们可
  • vcpkg下载不了报错

    使用powershell 添加环境变量 env HTTPS PROXY http 127 0 0 1 7890
  • 【闲谈】GPL3.0、Apache LICENSE 2.0 和 MIT LICENSE的区别

    昨天写了一下Git连接GitHub 这里涉及到了GitHub 而GitHub作为一个开源社区 又涉及到了许可证的问题 当然 国内目前大部分人还是不在乎这个的 因为在国内 这些东西有和没有 影响不大 主要就是这三大许可证GPL3 0 Apac
  • 图解通信原理与案例分析-27: 卫星通信系统及关键技术

    前言 本系列的前面文章 主要拆解的是通信网络设备部署在地面上的通信 包括有线通信与无线通信 从本章开始 通信网络的部署从地面扩展到太空 包括卫星通信 GPS定位 单向广播卫星通信 第六代移动通信6G 埃隆马斯克的星链计划 量子通信等 太空通
  • 频繁打开数据库连接是否影响性能的疑惑

    之前写了很多数据库开发方面的程序 有的时候需要连续操作数据库 就在想这么密集去操作数据库会不会大量消耗资源 因为垃圾回收机制并不是马上执行 于是 特意了解了一下情况 其实 数据库连接并不是托管资源 所以垃圾回收管不到它 另外Stream 文