如何主动清空.NET数据库连接池?

      一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一维护,业务方通过某个配置字符串拿到的是开箱即用的Connection对象

     DBA能在对业务方无侵入的情况下,给业务方切换备份数据库,之后DBA要求旧连接池必须立即被清空。

那么问题来了: 不能立即清空.NET连接池?注意我用得是清空,而不是释放连接。

如果有同学不知道DBA做这个要求的目的,那我啰嗦一下:


应用程序不再使用旧连接时,理论上你的连接池要被完全清空,因为单纯的释放连接,只会让连接池中的Connection处于Sleep状态,依旧维持了短时间的物理连接这个短时间其实是不必要的占用,影响了旧连接数据库的吞吐量。

连接池知识背景

回答这个问题之前, 我们还是先研究一下.NET数据库连接池。

1. .NET数据库连接池的背景

数据库连接是一个耗时的行为,大多数应用程序只使用1到几种数据库连接,为了最小化打开连接的成本,ado.net使用了一种称为连接池的优化技术。

2. .NET 数据库连接池的表现

数据库连接池减少了必须打开新连接的次数,池程序维护了数据库物理连接。

通过为每个特定的连接配置保持一组活动的连接对象来管理连接。

每当应用程序尝试Open连接,池程序就会在池中找到可用的连接,如果有则返回给调用者;
应用程序Close连接对象时,池程序将连接对象返回到池中(Sleep), 这个连接可以在下一次Open调用中重用。

看黑板,下面是这次的重点:

3. .NET是如何形成数据库连接池的?

只有相同的连接配置才能被池化,.NET为不同的配置维护了不同的连接池。

相同的配置限制为:
进程相同、
连接字符串相同、
连接字符串关键key顺序相同。
(连接字符串提供的关键字顺序不同也将被分到不同的池)。

连接池中的可用连接的数量由连接字符串Max Pool Size决定。

在一个应用程序中,有如下代码:

using (SqlConnection connection = new SqlConnection(  "Integrated Security=SSPI;Initial Catalog=Northwind"))  {  connection.Open();// Pool A is created.  }  using (SqlConnection connection = new SqlConnection(  "Integrated Security=SSPI;Initial Catalog=pubs"))  {  connection.Open();// Pool B is created because the connection strings differ.  }  using (SqlConnection connection = new SqlConnection(  "Integrated Security=SSPI;Initial Catalog=Northwind"))  {  connection.Open();// The connection string matches pool A.  }  

上面创建了三个Connection对象,但是只形成了两个数据库连接池

还是以上代码,如果有两个相同的应用程序,理论上就形成了四个数据库连接池。

4. 连接池中的连接什么时候被移除?

连接池中的连接空闲4-8 分钟,池程序会移除这个连接。

应用程序下线,连接池直接被清空。

如何主动清空.NET连接池

有了以上知识背景,我们再来回顾一下DBA的要求,切换数据库连接配置的时候,清空原连接池。

 .NET提供了 ClearAllPools、ClearPool静态方法用于清空连接池。

• ClearAllPools:      清空与这个DBProvider相关的所有连接池• ClearPool(DBConnection conn)      清空与这个连接对象相关的连接池

很明显,我们这次要使用ClearPool(DBConnection conn) 方法。

光说不练不验证,不是我的风格。

天锤压测/queryapi 产生一个包含大量连接对象的连接池;

适当的时候,调用/clearpoolapi清空连接池。

 public class MySqlController : Controller{// GET: MySql[Route("query")]public string Index(){var s = "User ID=teinfra_neo_netreplay;Password=123456;DataBase=teinfra_neo_netreplay;Server=10.100.41.196;Port=3980;Min Pool Size=1;Max Pool Size=28;CharSet=utf8;";using (var conn = new MySqlConnection(s)){var comm = conn.CreateCommand();comm.CommandText = "select count(*) from usertest;";conn.Open();var ret = comm.ExecuteScalar();comm.CommandText = "select count(*) from information_schema.PROCESSLIST WHERE HOST like  '10.22.12.245%';";var len = comm.ExecuteScalar();return $"查询结果:{ret} ,顺便查一下当前连接池的连接对象个数: {len}";};}[Route("clearpool")]public string Switch(){var s = "User ID=teinfra_neo_netreplay;Password=123456;DataBase=teinfra_neo_netreplay;Server=10.100.41.196;Port=3980;Min Pool Size=1;Max Pool Size=28;CharSet=utf8;";using (var conn = new MySqlConnection(s)){conn.Open();MySqlConnection.ClearPool(conn);};using (var conn = new MySqlConnection(s)){conn.Open();var comm = conn.CreateCommand();comm.CommandText = "select count(*) from information_schema.PROCESSLIST WHERE HOST like  '10.22.12.245%';";var len = comm.ExecuteScalar();return $"之前已经清空连接池, 此次查询连接池有 {v1}  个连接对象";}}}

1.压测产生大量连接对象

2. mysql数据库对比

mysql的连接数查询命令: (host是web服务器IP):
select * from information_schema.PROCESSLIST WHERE HOST like '10.22.12.245%';

  3.  调用/clearpoolapi,清空连接池

bingo,清空连接池的理论得到验证。

旁白

这是我在同程艺龙最近爬的比较深的坑位, 在本次实践中我们了解到:

•.NET 数据库连接池属编程语言范畴,连接池维护了物理连接•.NET数据库连接池的定义方式:(同一进程、同一连接字符串、同一连接字符串关键key顺序一致) 被划到一个池•DB客户端查询当前连接数的方式

根据这个思路改造祖传代码,.NET数据获取组件SDK 已经满足了DBA的要求。

希望本文设计考量、理论+论证的行文思路对读者有所帮助, 距离上次发文一月有余,再次感谢5000+读者不离不弃。

引用链接

[1] sql连接池(ado.net): https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling

btw 成都同程艺龙常年招收资深golang开发者,有机会参与企业级服务治理实践。

本文内容和制图均为原创,文章永久更新地址请参阅左下角原文,如对您有所帮助,请一键三连,方便的话置一个星标 ~。。~。

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

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

相关文章

Java面试会问的——数组、声明、初始化、冒泡、多维数组、稀疏数组

数组 数组时相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成其中,每一个数据称作一个数组元素,每一个数组元素可以通过一个下标来访问它们。 数组声明创建 首先必须声明数组变量,才能在…

假如有人在今天炸了支付宝的存储服务器...

全世界只有3.14 % 的人关注了青少年数学之旅今天在知乎看到了一个问题《假如有人把支付宝存储服务器炸了(物理炸),大众在支付宝里的钱是不是就都没有了呢?》外行人问题。网站都是有服务器的,服务器都是有实体的。那么支…

Android STL PORT

ndk中包含了stl对应的库,在$(NKD_HOME)/sources/cxx-stl/stlport/stlport 有关Android NDK的C STL开发相关总结如下: 从Android NDK r5开始支持了STL Port,在这个版本开始就可以使用部分STL库的功能了,比如说vector、map,string摆脱c下面容易…

Cookie全解

1. Cookie 可以存储哪些值 在 Cookie 中只能存储个人可识别信息. 个人可识别信息是指可以用来识别或联系用户的信息. 例如用户的姓名, 电子邮件, 家庭住址等. 必须强调的是, 这些可识别信息必须是非机密或重要信息. 2. 使用 Cookie 对象保存和读取客户端信息. 要存储一个 Cooki…

C# 10 完整特性介绍

前言开头防杠:.NET 的基础库、语言、运行时团队从来都是相互独立各自更新的,.NET 6 在基础库、运行时上同样做了非常多的改进,不过本文仅仅介绍语言部分。距离上次介绍 C# 10 的特性已经有一段时间了,伴随着 .NET 6 的开发进入尾声…

代码格式

2019独角兽企业重金招聘Python工程师标准>>> 1.参考:JavaScript程序编码规范 转载于:https://my.oschina.net/u/1791074/blog/283578

94年出生,6篇SCI,一作发Science,你还不放下手上玩的泥巴

全世界只有3.14 % 的人关注了 青少年数学之旅 2019年9月27日,国际顶尖期刊《科学》(Science)杂志在线以全文Article的形式发表了北京航空航天大学材料科学与工程学院赵立东教授课题组在热电材料研究上取得的新进展,北京航空航天大…

一个问题让我直接闭门思过!!!拼多多面试必问项之List实现类:LinkedList

一、LinkedList概述 1、对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。 2、LinkedList是一个实现了List接口和Deque接口的双端链表。 3、LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口&a…

Docker小白到实战之开篇概述

前言“不对啊,在我这运行很正常啊”,这句话小伙伴们在前几年应该听得很多;每次一到安装、部署时总有一堆问题,毕竟操作系统版本、软件环境、硬件资源、网络等因素在作怪,此时难免会导致开发小伙伴和运维哥们互相甩锅&a…

GridView导出为Excel

protected void btExcel_Click(object sender, EventArgs e) { DataSet ds new DataSet(); ds Session["myDataSet"] as DataSet; DataTable DT ds.Tables[0]; //生成将要存放结果的Excel文件的名称 string NewFileN…

设置su为不需要密码切换为root

设置su为不需要密码 如果需要对某用户su命令也不需要输入密码,则需要修改下列的:1--->如果没有wheel组 则用sudo groupadd wheel创建命令为 sudo groupadd wheel;2---->sudo vim /etc/group将username和root加入到wheel用户组内 如图&a…

被女朋友拉黑后,我写了个“舔狗”必备神器

全世界只有3.14 % 的人关注了 青少年数学之旅 “ 在一个阳光明媚的清晨,我打开窗户呼吸了一口新鲜空气。阳光灿烂,岁月静好,又是一个约女朋友出去爬山吃饭看电影的好日子。 图片来自包图网 想到女朋友的大眼睛,我脸上不禁洋溢起了…

涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!

前言 就比如我前几天被面试官问什么是反射??? 而我的回答是!!! 反射是动态语言的关键,反射允许程序在执行期间借助Reflection API取得任何类的内部信息,并能直接操作任曦对象的内…

Wave 文件(5): 获取 Wave 文件的格式信息

装载格式信息的结构有: TWaveFormat wFormatTag: Word;nChannels: Word;nSamplesPerSec: DWORD;nAvgBytesPerSec: DWORD;nBlockAlign: Word; ;TPCMWaveFormat wf: TWaveFormat;wBitsPerSample: Word; ;TWaveFormatEx wFormatTag: Word; nChannels: Word; nSa…

如何摆脱「自我否定」状态

大家好,我是Z哥。你最近正处于自我否定的状态吗?如果不是的话,回想一下最近的一次处于这种状态是什么时候?当时的感受如何?以及,最终是如何走出这个状态的?不着急,给你 1 分钟回忆一…

struct and union

[url]http://hi.baidu.com/tweigh/blog/item/5303d2ef6e2720eace1b3e9d.html[/url]1. struct的巨大作用面对一个人的大型C/C程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C程序,势必要 涉及一些(甚至大量)进…

编码GBK的不可映射字符

为什么80%的码农都做不了架构师?>>> 由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式, 则javac.exe首先获得我们操作系统默认采用的编码格式, 也即在编译java…

低调的大神!他改变了半导体产业!史上唯一两次获得诺贝尔物理奖,却几乎被人遗忘...

全世界只有3.14 % 的人关注了青少年数学之旅两次获得诺贝尔奖的科学家,世界上仅有这四个人!他们是:1. 居里夫人(Marie Curie,1867~1934),波兰科学家,他的丈夫叫皮埃尔居里,两人合称“居里夫妇”! 1903年,居里夫妇和亨利...2.约翰巴丁 美国物理…

TTime::FormatL详解

TTime::FormatL详解 示例&#xff1a;TTime time;Time.HomeTime();TBuf<32> timeBuf;time.FormatL(timeBuf,_L(“%F%Y/%M/%D,%H:%T:%S”)); // 2008/08/16,21:22:22详解&#xff1a;格式串分为本地相关和本地无关格式串&#xff0c;也就是说和系统的时间日期中设置的格式…

入职第一天,我接手了号称【屎山】的祖传代码,这还能卷吗???

公司各种各样的祖传代码都是令新人虎躯一震的代码&#xff0c;因为有时候你根本不知道它是干嘛的&#xff0c;甚至觉得它毫无用处&#xff0c;关键是 还绝对不能动&#xff0c;碰一段改半年&#xff0c;别问我怎么知道的。最讽刺的是&#xff0c;你可能为了修改代码&#xff0c…