高并发系统设计40讲之 池化技术
系统架构中,数据库的连接时间比SQL的执行时间要长, 为了提高效率,使用数据库连接池将连接预先建立好 用连接池预先建立数据库连接 数据库连接池有两个最重要的配置:最小连接数和最大连接数,它们控制着从连接池中获取连接的流程: 如果当前连接数小于最小连接数,则创建新的连接处理数据库请求; 如果连接池中有空闲连接则复用空闲连接; 如果空闲池中没有连接并且当前连接数小于最大连接数,则创建新的连接处理请求; 如果当前连接数已经大于等于最大连接数,则按照配置中设定的时间(C3P0 的连接池配置是 checkoutTimeout)等待旧的连接可用; 如果等待超过了这个设定时间则向用户抛出错误。 连接池故障: 数据库的域名对应的 IP 发生了变更,池子的连接还是使用旧的 IP,当旧的 IP 下的数据库服务关闭后,再使用这个连接查询就会发生错误; MySQL 有个参数是“wait_timeout”,控制着当数据库连接闲置多长时间后,数据库会主动地关闭这条连接。这个机制对于数据库使用方是无感知的,所以当我们使用这个被关闭的连接时就会发生错误。 如何保持连接池可用: 启动一个线程来定期检测连接池中的连接是否可用,比如使用连接发送“select 1”的命令给数据库看是否会抛出异常,如果抛出异常则将这个连接从连接池中移除,并且尝试关闭。目前 C3P0 连接池可以采用这种方式来检测连接是否可用