缘起
如果每次都类似:
我们经常提到线程池,数据库连接池,那么这个地方是否也应该用一种池的做法呢?
数据库连接池、线程池
数据库连接池、线程池那么的相似但是又不一样,让我想起来几周前和VIVO峰交流过这个问题。
下面是交流的大概结论:
数据库连接池和线程池不一样的,表面上似乎一样:线程池是线程的池子,数据库连接池是数据库连接的池子(好像是废话,哈哈),但是呢,线程池的线程不会跑出池子,数据库连接池的连接会跑出去,这使得他们内部的实现差异很大,数据库连接池就是应用程序会从连接池中,把连接拿走,close的时候,再还回数据库连接池,连接池要维护连接的可用性,最大连接数,还会有最大获取连接的等待时间,那么问题来了 数据库连接池 应该配置多少毕竟合适(这又是另外一个话题了),如果达到了最大连接数,并且连接池的连接全部被拿走了,这个时候再获取连接,需要等待,超时就会抛异常了。
不错的一篇线程池文章:深入分析java线程池的实现原理。
说到这里,我们应该对数据库连接池、线程池有个大概的了解了,从这里看我们上面的socket这个特性与数据库连接更像,下面我们谈谈怎么来实现。
池的实现
既然是池那么是否有一个容器进行存放这个资源,还必须要提供从容器取资源,和归还资源到容器的操作。
在Java中这个容器让我想到了:集合(线性的、链式的)、Map、队列、数组等等。
简单思路:
那么不管用那种容器都是可以存数据了(有时候需要注意并发),那么取就是 把容器里面内容取一个并且在容器里面移除,那么还就是把 拿走的在插入到容器中即可。
我们再想想连接池还有那些:
最大、最小个数、初始大小、空闲时间、获取不到的时候需要等多久或者一直等待 等等操作。
大家是倾向自己实现呢? 还是使用现成的呢 ?
期待留言区你的回答以及大概思路……
类似http连接也是属于珍贵资源,我们也是需要使用池的,很多资源都是非常稀缺的,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的用池把这些资源进行管理通常也是优化的一个重要手段。
领取专属 10元无门槛券
私享最新 技术干货