0

现在我们经常使用数据库连接池,因为数据库连接是有上限的也比较耗费资源,经常的打开关闭连接也耗时和浪费系统资源尤其在高并发的场景下
那这样的话可不可以所有的数据库客户端公用一个数据库连接呢?该链接默认是不会被客户端关闭的

7月9日提问

查看全部 6 个回答

0

数据库连接是半双工的,就是说只能发送一个指令(sql),然后获得结果,在获得结果之前不能再发送新的指令,如果只有一个连接,连续查询没有等到前面查询结果返回(不知道前面有没有查询)就会出错,如果加锁,并发性能肯定很差,不知道为啥不想用连接池,所有的网络连接都不是线程安全的,如果你就一个线程用不用连接池都可以,一个连接就能搞定,但是多个线程执行的时候用一个连接是不安全的,即使可以同时发两个请求,你不知道那个结果是你的,即使可以使用一个连接,你能知道哪个返回是谁的,但是半双工的连接要么写要么读,你想想那得有多慢

推荐答案

2

一个TCP连接是不能并发传输的,只能串行传输。
如果你的并发量很大,会导致并发堆积,所有的客户端都在MySQL传输的TCP上等待传输。
连接池就是为了解决这个问题的,每个客户端只在传输的时候独占一个TCP连接,当数据传输完了,放回连接池,这条TCP连接还可以被重复利用。

一般情况下,连接池也不是越大越好,连接池过多会导致CPU调度的时候上下文切换过于频繁,消耗很多资源,建议的连接池数量为:连接数 = ((核心数 2) + 有效磁盘数),一般设置为:((核心数 2) + 1)比较合适。

更多可以参考这篇文章: https://zhuanlan.zhihu.com/p/...

推广链接