【连接池】.NET开源 ORM 框架 SqlSugar 系列

 .NET开源 ORM 框架 SqlSugar 系列

  1. 【开篇】.NET开源 ORM 框架 SqlSugar 系列
  2. 【入门必看】.NET开源 ORM 框架 SqlSugar 系列
  3. 【实体配置】.NET开源 ORM 框架 SqlSugar 系列
  4. 【Db First】.NET开源 ORM 框架 SqlSugar 系列
  5. 【Code First】.NET开源 ORM 框架 SqlSugar 系列
  6. 【数据事务】.NET开源 ORM 框架 SqlSugar 系列
  7. 【连接池】.NET开源 ORM 框架 SqlSugar 系列-CSDN博客

1. ADO.NET 连接池

如何启用和禁用连接池❓

连接字符串中将连接池值 Pooling 设置为 true 或 yes,则会启用连接池(默认启用)。

启用后连接池后系统会根据并发情况将连接池保持在一个合理区间,让性能最大化,并不会立马清空。而是将他状态更改为sleep。禁用连接池性能会差一些,open就打开连接池 close就关闭连接池。

1.1 Open() 

1、启用连接池情况(默认)

先找有没有睡眠的连接池有恢复连接池,如果没有睡眠的连接池打开新的连接池

2、禁用连接池情况(需要字符串关闭)

打开新连接池

1.2 Close ()

1、启用连接池情况(默认)

将现有连接池睡眠

2、禁用连接池情况(需要字符串关闭)

关闭连接池

1.3 dispose()

方法实际是和 close()做的同一件事,唯一区别是 dispose 会销毁当前C#对象

SqlSugar dispose后在打开不会报错,原理如下:

 var db = GetInstance();db.Open();Console.WriteLine(db.Ado.Connection.GetHashCode());db.Close();Console.WriteLine(db.Ado.Connection.GetHashCode());db.Dispose();//如果下次在使用db会new出新的SqlConnection和Ado.net不一样Ado.net是直接报错Console.WriteLine(db.Ado.Connection.GetHashCode());

输出结果如下:

image.png

唯一的区别是Dispose后在使用db,db对象会换成新的而不在是以前的,而close后在使用还是同一个db对象。

2、SqlConnection和连接池

SqlConnection 非线程安全对象,不同上下文要new不同对象

con.Open(); //请求数据库连接池 查找有没有 sleep 状态的,没有创建连接池
con.Close();//将当前连接池状态改为sleep , 如果长时间不用会销毁

上面的原理可以看出

1. 同一个对象多次 open 和 close 都是在现有的连接池里面去操作

2. 就算是多个SqlConnection不在同时间请求,也可能会用同一个连接池 

3.多个SqlConnection 并发操作会找有没有空闲的连接池,没有在创建

所以连接池在.NET中 微软封装的很好,很成熟 多数.NET用户都不知道是什么玩意儿。

连接超时设置

在连接池符串加上 Connection Timeout=10  ,默认是30秒,单位秒

.NET中要配置连接池吗

 答:什么都不用配置只要学会 open 和 close就行了 

3、SqlSugarClient原理

1.手动释放模式和SqlConnection原理一模一样,底层就是用的SqlConnection并且需要注意线程安全

//创建数据库对象 SqlSugarClient   SqlSugarClient db = new SqlSugarClient(new ConnectionConfig(){ConnectionString = "Server=.xxxxx", DbType = DbType.SqlServer,IsAutoCloseConnection = false//手动释放  是长连接 });//需要手动using //或者//db.Open();//db.Close();

2.自动释放(推荐),说白了不需要你去写 using 或者 close和open


//创建数据库对象 SqlSugarClient   SqlSugarClient db = new SqlSugarClient(new ConnectionConfig(){ConnectionString = "Server=.xxxxx", DbType = DbType.SqlServer,IsAutoCloseConnection = true//自动释放});//写代码就不需要考虑 open close 直接用就行了

 情况1: 没有事务的情况 ,每次操作自动调用 open和close

 情况2: 有事务的情况下 ,开启事务调用 open  提交或者回滚事务调用 close

4、SqlSugarScope原理

它是对 SqlSugarClient 的封装让他支持线程安全,并且在不同上下文自动new 出 SqlSugarClient,在编写代码的时候不需要考虑他线程是否安全

什么是上下文

异步情况: 在同一串await 中是一个上下文

同步情况: 在同一个线程是同一个上下文

同一个SqlSugarScope 做到了在同一个上下文共享一个对象,不同上下文自动去NEW

5、如何验证是否释放

默认情况下只要超过100个请求没关闭就会报错,不同库可能有差异

         for (int i = 0; i < 501; i++){SqlSugarClient db = new SqlSugarClient(new ConnectionConfig(){DbType = DbType.Oracle,ConnectionString = Config.ConnectionString,IsAutoCloseConnection = false//设成关闭这个代码会直接报错});db.Ado.GetInt("SELECT 1 from dual"); }//IsAutoCloseConnection=true 执行成功//IsAutoCloseConnection=false 会出现连接池超时或者超过上限等错误

6、总结

他们3者的关系应该是这样的:

  1. SqlSugarScope 底层+自动释放+上下文安全
  2. SqlSugarClient  底层+自动释放控制
  3. SqlConnection   底层

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu24.04安装Kubernetes1.31.0(k8s1.30.0)高可用集群

ubuntu24.04安装Kubernetes1.30.0(kubernetes1.30.0)高可用集群 一、总体概览 目前最新版的K8S版本应该是1.31.0,我们安装的是第二新的版本1.30.0,因为有大神XiaoHH Superme指路,所以基本上没踩坑,很顺利就搭建完成了。所有的机器都采用的最新版Ubuntu-Server-24.04长期支…

微软要求 Windows Insider 用户试用备受争议的召回功能

拥有搭载 Qualcomm Snapdragon 处理器的 Copilot PC 的 Windows Insider 计划参与者现在可以试用 Recall&#xff0c;这是一项臭名昭著的快照拍摄 AI 功能&#xff0c;在今年早些时候推出时受到了很多批评。 Windows 营销高级总监 Melissa Grant 上周表示&#xff1a;“我们听…

脉冲动画效果

js实现脉冲动画效果&#xff1a; 鼠标点击时&#xff0c;添加动画类&#xff0c;进而实现动画效果&#xff0c;鼠标离开时&#xff0c;移除动画类&#xff0c;回归静态图效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UT…

Linux—进程学习—04(进程地址空间学习)

目录 Linux—进程学习—41.程序地址空间1.1虚拟地址空间的现象1.2虚拟地址空间的理解(感性) 2.进程地址空间2.0 mm_struct结构体2.1 mm_struct结构体的源代码2.2分页&虚拟地址空间解释前面的实验现象 2.3进程地址空间存在的原因2.3.1第一个原因2.3.2第二个原因2.3.3第三个原…

图论入门编程

卡码网刷题链接&#xff1a;98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …

Oracle对比表与表之间的结构

自己首先想到的就是,navicat有提供结构同步 但是有些时候情况不一样,比如我遇到的是连接不同,而且是互相同步,以最多的列的那个表为样 没有说一个固定的源 那么还可以通过导出表结构去另一个库中执行看是否报错,以此来判断结构的不同 但是我感觉有点儿麻烦 最后想到通过sql语…

数据结构与算法——N叉树(自学笔记)

本文参考 N 叉树 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 遍历 前序遍历&#xff1a;A->B->C->E->F->D->G后序遍历&#xff1a;B->E->F->C->G->D->A层序遍历&#xff1a;A->B->C->D->…

关于音频 DSP 的接口种类以及其应用场景介绍

在音频系统中&#xff0c;DSP&#xff08;数字信号处理器&#xff09;扮演着重要角色&#xff0c;通常会通过不同的接口与音频系统中的其他组件&#xff08;如功放、扬声器、音频源等&#xff09;进行连接。以汽车应用场景为例&#xff0c;以下是一些常见的接口类型分类及其介绍…

Linux操作系统学习---初识环境变量

目录 ​编辑 环境变量的概念&#xff1a; 小插曲&#xff1a;main函数的第一、二个参数 获取环境变量信息&#xff1a; 1.main函数的第三个参数 2.查看单个环境变量 3.c语言库函数getenv() 和环境变量相关的操作指令&#xff1a; 1.export---导出环境变量&#xff1a; 2.unse…

多视图几何中向量叉乘的矩阵转换 Matrix Transformation for Cross Product in MVG

Title: 多视图几何中向量叉乘的矩阵转换 Matrix Transformation for Cross Product in MVG 文章目录 I. 向量叉乘的矩阵转换恒等式II. 符号计算 Maxima 程序推导III. 推论和关联公式的说明1. 推论2. 应用于对极几何中基本矩阵推导3. 应用于基本矩阵与单应矩阵关系4. 与刚体运动…

支持多种快充协议的取电芯片,支持最大功率140W

前言 在快节奏的现代生活中&#xff0c;人们对于小家电的依赖日益加深&#xff0c;而随之而来的充电问题也日益凸显。传统的充电方式往往受限于电压、电流的限制&#xff0c;难以满足不同设备对电力的多样化需求。而PD快充协议的诞生&#xff0c;则为这一难题提供了全新的解决…

分页查询功能

EmployeeController /** * 员工分页查询 * * param employeePageQueryDTO * return */ GetMapping("/page") ApiOperation("员工分页查询") public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO) { log.info("…

“移门缓冲支架:为家庭安全加码”

在智能家居日益普及的今天&#xff0c;科技不仅改变了我们的生活方式&#xff0c;也提升了家居的安全。移门缓冲支架作为一项结合了现代技术的小型装置&#xff0c;正逐渐成为提升家庭安全的重要配件。它通过吸收门关闭时的冲击力、减缓关门速度以及减少噪音等多重功能&#xf…

力扣96:不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;1 卡…

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展

Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型&#xff08;LLM&#xff09;的指南。Torchtune 是一个PyTorch库&#xff0c;旨在让您轻松地…

Java使用replaceAll替换时不使用正则表达式

前言 public String replaceAll(String regex, String replacement) {return Pattern.compile(regex).matcher(this).replaceAll(replacement);}在使用String.replaceAll() 方法时&#xff0c;由于入参时regex &#xff0c;而入参刚好是正则表达式的字符该怎么办&#xff1f;我…

【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)

1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…

STM32C011开发(3)----Flash操作

STM32C011开发----3.Flash操作 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置堆栈设置串口重定向FLASH数据初始化FLASH 读写演示 概述 STM32C011 系列微控制器内置 Flash 存储器&#xff0c;支持程序存储与数据保存&#xff0c;具备页面擦除、双字写入…

电商项目高级篇06-缓存

电商项目高级篇06-缓存 1、docker下启动redis2、项目整合redis3、redis改造三级分类业务 缓存 流程图&#xff1a; data cache.load(id);//从缓存加载数据 If(data null){ data db.load(id);//从数据库加载数据 cache.put(id,data);//保存到 cache 中 } return data;在我们…