“池”机制的核心
- 重(chong)用❤️❤️❤️❤️❤️
- 缓冲❤️❤️❤️
- 限制最大数❤️❤️❤️❤️
统一管理“池”里的对象(这个与重用不么和,统一管理的目的是重用和限制最大数)❤️❤️
。。。。。❤️❤️
【1】“池”机制有个定长的容器。
【2】初始化时容器中存储有定量的“池”对象,当然也可以“懒”加载,即开始不创建,运行时创建放入“池”中(在此用“池”对象统称“池”中的线程、进程或者连接等,下文同)。
【3】程序中需要使用到对象时,可直接通过“池”获取。
【4】如果“池”容器中有“池”对象时,直接给程序使用。
【5】如果“池”容器中没有“池”对象,可以创建新对象供程序使用。
【6】创建新对象时可以设置上限。
【7】程序使用完对象,放入“池”中。
【8】如果“池”容器满了,则可以销毁多余的对象。
“池”机制的流程图
看起来阔能有点复杂,哈哈不过看下示例促进下理解。O(∩_∩)O
实例
有个“连接池”,“池”容器的大小为100,系统可创建最大连接数为500(假定连接程序均使用一秒后退换/销毁)
【1】
如果有连接池
当每秒有100以内个线程需要使用连接时,程序可以直接取现成的连接,程序运行效率可想而知。如果没有连接池
当每秒有100以内的线程需要使用连接时,程序需要创建连接100个,程序运行效率很显然会受影响。描述 | 需要连接数 | 创建连接数 | n秒需要创建总连接次数 |
---|---|---|---|
有连接池 | 100/s | 100 | |
没有连接池 | 100/s | 100/s | 100*n |
很显然,没有连接池需要创建的连接数十分巨大,开销也不言而喻。反之使用连接池只需要在启动时创建100个即可,当然需要占据一部分内存,但是再性能方面的提升是非常大的。
【2】
如果有连接池
当有1000个线程需要使用连接时,程序可以先直接取用100个作为缓冲,但是还有900个线程五法满足,可以创建新的连接400个,此时已经提供了500个连接,但是达到了系统创建连接的上限无法再创建新的连接,剩余500个线程五法满足,需要添加到等待队列中等待池中有新的连接时才可使用。当500个拿到连接的线程用完连接时,依次将连接归还时,池可以顺次将归还的连接提供给等待队列中的线程使用。如果没有连接池
当有1000个线程需要使用连接时,程序需要创建连接500,没使用完一个连接销毁后,在创建一个新的连接。描述 | 需要连接数 | 创建连接数 |
---|---|---|
有连接池 | 1000 | |
没有连接池 | 1000 | 1000 |
有连接池 | 2000 | |
没有连接池 | 2000 | 2000 |
数据量小的时候看不出来性能的差异,但是如果并发量比较大时,有连接池的程序能够无论并发量多大都能够合理的重用连接。而没有连接池的程序会出现反复的销毁和创建。
当然如果需求是每秒钟1000个,达到系统的上限了,池机制是不能搞定的,得加机器
如有疏漏之处还望及时反馈