看了一篇文章How to Manage Connections Efficiently in Postgres, or Any Database, 文章讨论了如何管理Postgres数据库连接,列举了几种方式:
- 每个请求一个连接
- 连接复用
- 连接池
- 连接池管理工具
连接池作者提出了三种分别是Session pooling
,Transaction pooling
,Statement pooling
,我们一般常用的是事务连接池,最开始是每个工程自行创建维护与数据库的连接池,但是在工程部署多了之后,部署工程数N,每个工程连接池的连接数量M,所需的总连接数 N*M 会超过数据库所允许的最大连接数,这种情况下我们需要一个总的连接池代理,工程不再直接连接到数据库中,由连接池管理工具来承接所有的连接请求,再请求到数据库中。
其实很多工具的出现都是由于资源的有限性与任务的复杂性之间的矛盾引起的,如果连接是无限的,那我们不需要讨论使用连接池技术,每个连接进来保持一个数据库连接就可以了,还有著名的 C10K 问题。我们使用复杂度更低的算法,优化各种场景下的参数,本质上都是由于计算资源的有限性导致的。
对于这个矛盾我们可用的工具有:
- 算法优化
- 异步
- 就近原则(皓哥提到过的边缘计算)
- 池(对象池,连接池等)
- 局部性原理(缓存,JIT等)