什么是连接?
连接可以定义为客户机与服务器通信的一种方式。它需要发送命令并接收结果。
例如,浏览器使用TCP连接与您喜爱的网站进行对话。类似地,数据库连接允许您以结果集的形式发出命令并接收结果。
连接池可以应用于任何连接,如TCP连接、数据库连接甚至Redis连接。但在本文中,我将主要以数据库连接为例。
正常连接有什么问题?
假设我们有一个Postgres数据库,您想对它运行这个查询。
select chairs from dining_table;为了得到结果,我们需要提供数据库详细信息和身份验证详细信息,通常是主机、端口、数据库、用户名和密码。这些是必需的,因为在实际运行查询之前,程序必须:
→查找数据库 →连接到它 →验证我们的连接 →使用给定的数据库 →然后运行我们的查询。
一旦返回结果,连接将关闭。当我们想运行不同的查询时,我们需要重新开始。
正如你所看到的,这很费时。身份验证是一个非常昂贵的过程,大多数情况下,与实际运行的查询相比,创建连接所需的时间相对较长。因此,为每个查询创建连接变得非常低效。
因此,不是关闭连接,而是保持连接处于活动状态并使用同一个连接运行所有查询,从而消除了创建延迟。但是在服务中,我们如何在不同的客户端之间共享连接?这就是连接池的用武之地。
连接池通过在开始时创建一个连接池并在结束时保持连接的活动(即不关闭连接)来缓解此问题。每当应用程序的某个部分要查询数据库时,它们会从池中借用连接,一旦完成查询而不是关闭连接,它就会返回到池中。就这么简单。
使用这种方式,即使是少量的连接池也可以服务于大量的请求,因为每个请求的身份验证开销都被消除了。
有很多惊人的连接池库,如hikaripc,c3p0等,其中大多数允许您配置诸如min thread,max thread,idle timeout之类的东西,使连接池满足我们的需要。
