缘起
之前发过三篇 fastdfs 相关内容: FastDFS 集群 安装 配置 https://mp.weixin.qq.com/s?__biz=MzU2NjIzNDk5NQ==&mid=2247484490&idx=1&sn=cef6e7a508f947ca04224d3201cb5918&scene=21#wechat_redirect , 分布式文件系统 FastDFS 详解 https://mp.weixin.qq.com/s?__biz=MzU2NjIzNDk5NQ==&mid=2247484484&idx=1&sn=af0db7b8e2c97a0e8b62d435779b19f9&scene=21#wechat_redirect , 一次 FastDFS 并发问题的排查经历 https://mp.weixin.qq.com/s?__biz=MzU2NjIzNDk5NQ==&mid=2247484478&idx=1&sn=b0560d796ac810b1c6c2ffc266cba1f7&scene=21#wechat_redirect , 今天在看 fastdfs 的 java 客户端代码发现如下:
如果每次都类似:
trackerServer = trackerClient.getConnection();
我们经常提到线程池, 数据库连接池, 那么这个地方是否也应该用一种池的做法呢?
数据库连接池, 线程池
数据库连接池, 线程池那么的相似但是又不一样, 让我想起来几周前和 VIVO 峰交流过这个问题.
下面是交流的大概结论:
数据库连接池和线程池不一样的, 表面上似乎一样: 线程池是线程的池子, 数据库连接池是数据库连接的池子 (好像是废话, 哈哈), 但是呢, 线程池的线程不会跑出池子, 数据库连接池的连接会跑出去, 这使得他们内部的实现差异很大, 数据库连接池就是应用程序会从连接池中, 把连接拿走, close 的时候, 再还回数据库连接池, 连接池要维护连接的可用性, 最大连接数, 还会有最大获取连接的等待时间, 那么问题来了 数据库连接池 应该配置多少毕竟合适 (这又是另外一个话题了), 如果达到了最大连接数, 并且连接池的连接全部被拿走了, 这个时候再获取连接, 需要等待, 超时就会抛异常了.
不错的一篇线程池文章: 深入分析 java 线程池的实现原理 https://mp.weixin.qq.com/s?__biz=MzU2NjIzNDk5NQ==&mid=2247483878&idx=1&sn=f607864bc7809f878b59f402ebb36406&scene=21#wechat_redirect .
说到这里, 我们应该对数据库连接池, 线程池有个大概的了解了, 从这里看我们上面的 socket 这个特性与数据库连接更像, 下面我们谈谈怎么来实现.
池的实现
既然是池那么是否有一个容器进行存放这个资源, 还必须要提供从容器取资源, 和归还资源到容器的操作.
在 Java 中这个容器让我想到了: 集合 (线性的, 链式的),Map, 队列, 数组等等.
简单思路:
那么不管用那种容器都是可以存数据了 (有时候需要注意并发), 那么取就是 把容器里面内容取一个并且在容器里面移除, 那么还就是把 拿走的在插入到容器中即可.
我们再想想连接池还有那些:
最大, 最小个数, 初始大小, 空闲时间, 获取不到的时候需要等多久或者一直等待 等等操作.
大家是倾向自己实现呢? 还是使用现成的呢 ?
期待留言区你的回答以及大概思路......
类似 http 连接也是属于珍贵资源, 我们也是需要使用池的, 很多资源都是非常稀缺的, 如果被无限制的创建, 不仅会消耗系统资源, 还会降低系统的稳定性, 合理的用池把这些资源进行管理通常也是优化的一个重要手段.
来源: https://juejin.im/entry/5afea6eef265da0ba76ffdc1