比如有 100 条 sql,如果不手动开启事务把这 100 条 sql 放在同一个事务中执行,那么这 100 条 sql 会分别在 100 个隐式事务中。每个事务占用一个连接,这样就占用了 100 个连接。
虽然 mysql 客户端有连接池,但是占用大量的连接会导致连接池中连接数量不够用,连接池会创建新的连接,有性能开销。而且如果每次请求都执行 100 条 sql,qps 500 的话,100 * 500 = 50000 个事务,需要 5w 个连接,这样创建的开销是很大的。
虽然 mysql 客户端连接池可以设置最小连接数/最大连接数,不会达到 5w 个连接这么夸张的数目。但是由于事务太多,连接池中的连接数目有限,事务被放入连接池的阻塞队列等待执行,也会导致耗时增加。
基于阻塞队列纯手写实现数据库连接池 https://blog.csdn.net/u011583316/article/details/89107394
这篇文章里可以看到,mysql 客户端连接池和线程池类似,也有阻塞队列
截图来自:01.基础架构:一条SQL查询…句是如何执行的?-- 《MySQL 实战 45 讲–丁奇》