database的connect

来源:这里教程网 时间:2026-03-03 17:20:38 作者:

自己原文公众号: https://mp.weixin.qq.com/s/xGmMgbTm9D5gsFE1jeTW4g

几天我被问到连接数的问题。一般来说开发都希望设置一个较大的连接数以确保程序不会出问题。

    想起我以前经历公司,我有一次模拟并发场景,测试数据库压力。当时我4个会话不停压update和insert的场景。最后结论是每秒处理2000个事务(单机Oracle)没有问题。当时我的领导问,我们有几千个用户,你只模拟4个不合适吧?我回答,请问我们有几千台服务器吗?我们应该只有4个tomcat吧?就算有再多的手机连接最后还是汇聚在4个tomcat上,哪里能有几千个连接?我领导想想说也是。

    再说一个案例,我之前做公安行业的,一个城市几百上千个摄像头太正常了。做省级平台的时候就监控设备就快上万了,摄像头要十几万了。很显然我没有上万台服务器,有的只是几台甚至十几台通讯服务器。每个通讯服务器连接几十台到上百台监控设备,不停的采集车辆和人员的数据。也就是说我有上万的设备到了数据中心也就几十台通讯服务器。而每个通讯服务器不停向数据库写入数据。其实每个用一个会话就够了。再加上公安用户使用一个web系统登录。整个数据库活动会话也不超过40个。

      那么日常我们为什么大家习惯于设置较大?主要是一个SQL执行不完,又来一个请求,那么这个会话不能复用,所以要再来一个会话,如果密集的话那么就瞬间高了。然后就故障了。

   曾经看到一个文章大致是这样的:(网上可以找到)模拟  9600 个并发线程来操作数据库,每两次数据库操作之间 sleep 550ms,

每个请求要在连接池队列里等待 33ms,获得连接之后,执行SQL需要耗时77ms, CPU 消耗维持在 95% 左右;

接下来,我们将连接池的大小改小点,连接池的大小降低到 96,并发数等其他参数不变,看看结果如何:

每个请求在连接池队列中的平均等待时间为 1ms, SQL 执行耗时为 2ms.

我们没调整任何东西,仅仅只是将数据库连接池的大小降低了,这样,就能把之前平均 100ms 响应时间缩短到了 3ms。

      是不是觉得反常规?

    Nginx 内部仅仅使用了 4 个线程,其性能就大大超越了 100 个进程的 Apache HTTPD 呢?追究其原因的话,回想一下计算机科学的基础知识,答案其实非常明显。

    因为我的计算机体系是冯诺依曼体系。就是计算机都是顺序执行的。

    即使是单核 CPU 的计算机也能“同时”运行着数百个线程。但我们其实都知道,这只不过是操作系统快速切换时间片,跟我们玩的一个小把戏罢了。 一核 CPU同一时刻只能执行一个线程,然后操作系统切换上下文,CPU 核心快速调度,执行另一个线程的代码,不停反复,给我们造成了所有进程同时运行假象。

    我爸爸就经常说我不要开很多东西,计算机是分时处理系统。

     其实,在一核 CPU 的机器上,顺序执行 A B 永远比通过时间分片切换“同时”执行 A B 要快,其中原因,学过操作系统这门课程的童鞋应该很清楚。一旦线程的数量超过了 CPU 核心的数量,再增加线程数系统就只会更慢,而不是更快,因为这里涉及到上下文切换耗费的额外的性能。

所以我们没必要开很多闲置会话,没什么用。redis单线程也很快啊!对不对?

  今天先说到这里吧。

相关推荐