请选择 进入手机版 | 继续访问电脑版

[ASP.NET] 详解.NET数据库毗连 池

[复制链接]
查看162 | 回复42 | 2021-9-15 05:14:44 | 显示全部楼层 |阅读模式
目次

一样平常 我们的项目中会使用 1到2个数据库毗连 设置 ,同程艺龙的数据库毗连 设置 被收拢到同一 的设置 中心 ,由DBA同一 设置 和维护,业务方通过某个字符串设置 拿到的是Connection对象。

详解.NET数据库毗连
池

DBA能在对业务方无侵入的环境 下,给业务方切换备份数据库,之后DBA要求旧毗连 池必须立刻 被清空, 那么标题 来了: dotnet能不能立刻 清空毗连 池? 留意 我用得是清空,而不是开释 毗连 。

  1. 如果有同学不知道DBA做这个要求的目的,那我啰嗦一下:<br data-filtered="filtered" />
  2. 应用程序不再使用旧连接时,理论上你的连接池要被完全清空,因为单纯的释放连接,只会让连接池中的Connection处于Sleep状态,依旧维持了短时间的物理连接,这个短时间其实是不必要的占用,影响了旧连接数据库的吞吐量。
复制代码

前置知识背景

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

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

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

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

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

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

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

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

3. .NET是怎样 形成数据库毗连 池的?

只有雷同 的毗连 设置 才能被池化,.NET为不同的设置 维护了不同的毗连 池。

雷同 的设置 限定 为:
进程 雷同 、
毗连 字符串雷同 、
毗连 字符串关键key次序 雷同 。
(同一毗连 提供的关键字次序 不同将被分到不同的池)。

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

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

  1. using (SqlConnection connection = new SqlConnection(
  2. "Integrated Security=SSPI;Initial Catalog=Northwind"))
  3. {
  4. connection.Open();
  5. // Pool A is created.
  6. }
  7. using (SqlConnection connection = new SqlConnection(
  8. "Integrated Security=SSPI;Initial Catalog=pubs"))
  9. {
  10. connection.Open();
  11. // Pool B is created because the connection strings differ.
  12. }
  13. using (SqlConnection connection = new SqlConnection(
  14. "Integrated Security=SSPI;Initial Catalog=Northwind"))
  15. {
  16. connection.Open();
  17. // The connection string matches pool A.
  18. }
复制代码

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

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

4. 毗连 池中的毗连 什么时间 被移除?

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

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

.NET 怎样 清空毗连 池?

有了以上知识背景

我们再往返 顾一下 DBA的要求,切换原毗连 设置 的时间 ,清空毗连 池。

我从官方文档找到
.NET提供了
ClearAllPools、ClearPool静态方法用于清空毗连 池。

  • ClearAllPools: 清空与这个DBProvider相干 的全部 毗连 池
  • ClearPool(DBConnection conn) 清空与这个毗连 对象相干 的毗连 池

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

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

天锤压测/queryapi 产生一个包含大量毗连 对象的毗连 池;
得当 的时间 ,/clearpoolapi清空毗连 池。

  1. public class MySqlController : Controller
  2. {
  3. // GET: MySql
  4. [Route("query")]
  5. public string Index()
  6. {
  7. 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;";
  8. using (var conn = new MySqlConnection(s))
  9. {
  10. var comm = conn.CreateCommand();
  11. comm.CommandText = "select count(*) from usertest;";
  12. conn.Open();
  13. var ret = comm.ExecuteScalar();
  14. comm.CommandText = "select count(*) from information_schema.PROCESSLIST WHERE HOST like '10.22.12.245%';";
  15. var len = comm.ExecuteScalar();
  16. return $"查询结果:{ret} ,顺便查一下当前连接池的连接对象个数: {len}";
  17. };
  18. }
  19. [Route("clearpool")]
  20. public string Switch()
  21. {
  22. 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;";
  23. using (var conn = new MySqlConnection(s))
  24. {
  25. conn.Open();
  26. MySqlConnection.ClearPool(conn);
  27. };
  28. using (var conn = new MySqlConnection(s))
  29. {
  30. conn.Open();
  31. var comm = conn.CreateCommand();
  32. comm.CommandText = "select count(*) from information_schema.PROCESSLIST WHERE HOST like '10.22.12.245%';";
  33. var len = comm.ExecuteScalar();
  34. return $"之前已经清空连接池, 此次查询连接池有 {v1} 个连接对象";
  35. }
  36. }
  37. }
复制代码

1. 颠末 压测工具

详解.NET数据库毗连
池

2. mysql数据库对比

详解.NET数据库毗连
池

  1. mysql的连接数查询命令, (host是web服务器IP):<br data-filtered="filtered" />
  2. select * from information_schema.PROCESSLIST WHERE HOST like '10.22.12.245%';
复制代码

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

详解.NET数据库毗连
池

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

干货旁白

这是我在同程艺龙迩来 爬的比较深的坑位,
我从本次实践中明确 了.NET数据库毗连 池的定义方式、并配套把握 了DBProvider 对于.net毗连 数的查询定位方式。

对祖传代码的改造,.NET数据获取组件SDK 确实进步 了原数据库的吞吐量。

渴望 本文计划 考量、理论+论证的行文思绪 对于读者有所帮助, 再次感谢故意 读者取关、再关注。

到此这篇关于详解.NET数据库毗连 池的文章就先容 到这了,更多相干 .NET数据库毗连 池内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 陆子525630 | 2021-9-22 18:14:40 | 显示全部楼层
admin楼主人气很旺!
回复

使用道具 举报

avatar 找食的麻雀粮 | 2021-10-2 03:58:21 | 显示全部楼层
大神就是大神,这么经典!
回复

使用道具 举报

avatar 大龙山草 | 2021-10-2 21:35:58 | 显示全部楼层
系统居然说我是在灌水,我有吗?
回复

使用道具 举报

avatar 唰唰冷呵映 | 2021-10-3 22:16:25 | 显示全部楼层
我裤子脱了,纸都准备好了,你就给我看这个?
回复

使用道具 举报

avatar 驳论王洪qa | 2021-10-4 16:05:28 | 显示全部楼层
admin楼主病的不轻啊!
回复

使用道具 举报

avatar 阿甘cx1982 | 2021-10-5 07:03:43 | 显示全部楼层
论坛的人气不行了!
回复

使用道具 举报

avatar 想出轨逗 | 2021-10-6 06:02:00 | 显示全部楼层
admin楼主,您忘记吃药了吧?
回复

使用道具 举报

avatar lj1282502016 | 2021-10-7 14:22:15 | 显示全部楼层
顶!顶!顶!
回复

使用道具 举报

avatar 123457441 | 2021-10-8 01:35:35 | 显示全部楼层
楼上的真不讲道理!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则