关于“池”机制的思考(线程池、进程池、连接池等)


“池”机制的核心

  1. 重(chong)用❤️❤️❤️❤️❤️
  2. 缓冲❤️❤️❤️
  3. 限制最大数❤️❤️❤️❤️
  4. 统一管理“池”里的对象 (这个与重用不么和,统一管理的目的是重用限制最大数)❤️❤️
    。。。。。❤️❤️

【1】“池”机制有个定长的容器。

【2】初始化时容器中存储有定量的“池”对象,当然也可以“懒”加载,即开始不创建,运行时创建放入“池”中(在此用“池”对象统称“池”中的线程、进程或者连接等,下文同)。
【3】程序中需要使用到对象时,可直接通过“池”获取。
【4】如果“池”容器中有“池”对象时,直接给程序使用。
【5】如果“池”容器中没有“池”对象,可以创建新对象供程序使用。
【6】创建新对象时可以设置上限。
【7】程序使用完对象,放入“池”中。
【8】如果“池”容器满了,则可以销毁多余的对象。

“池”机制的流程图

没有
满了
没满
到达上线
没到达上线
定长容器即池
程序取对象
程序归还对象
初始化容器
判断是否有对象
判断是否到达上限
判断容器是否满
创建对象
销毁对象
等待队列

看起来阔能有点复杂,哈哈不过看下示例促进下理解。O(∩_∩)O


实例

有个“连接池”,“池”容器的大小为100,系统可创建最大连接数为500(假定连接程序均使用一秒后退换/销毁)

【1】

如果有连接池

当每秒有100以内个线程需要使用连接时,程序可以直接取现成的连接,程序运行效率可想而知。

如果没有连接池

当每秒有100以内的线程需要使用连接时,程序需要创建连接100个,程序运行效率很显然会受影响。
描述需要连接数创建连接数n秒需要创建总连接次数
有连接池100/s100(可启动时创建) 0100
没有连接池100/s100/s100*n

很显然,没有连接池需要创建的连接数十分巨大,开销也不言而喻。反之使用连接池只需要在启动时创建100个即可,当然需要占据一部分内存,但是再性能方面的提升是非常大的。


【2】

如果有连接池

当有1000个线程需要使用连接时,程序可以先直接取用100个作为缓冲,但是还有900个线程五法满足,可以创建新的连接400个,此时已经提供了500个连接,但是达到了系统创建连接的上限无法再创建新的连接,剩余500个线程五法满足,需要添加到等待队列中等待池中有新的连接时才可使用。当500个拿到连接的线程用完连接时,依次将连接归还时,池可以顺次将归还的连接提供给等待队列中的线程使用。

如果没有连接池

当有1000个线程需要使用连接时,程序需要创建连接500,没使用完一个连接销毁后,在创建一个新的连接。
描述需要连接数创建连接数
有连接池1000100(可启动时创建) 400
没有连接池10001000
有连接池2000100(可启动时创建) 400
没有连接池20002000

数据量小的时候看不出来性能的差异,但是如果并发量比较大时,有连接池的程序能够无论并发量多大都能够合理的重用连接。而没有连接池的程序会出现反复的销毁和创建。

当然如果需求是每秒钟1000个,达到系统的上限了,池机制是不能搞定的,得加机器


如有疏漏之处还望及时反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鼠晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值