数据库连接池(connection pool)是程序启动时建立多个数据库连接,并将这些连接组成一个连接池,统一进行管理,由程序动态地对池中的链接进行申请,使用,释放。
数据库连接得到复用,避免了频繁的创建、释放连接带来的性能开销,减少内存碎片。
数据库连接池初始化时,已经创建多个数据库连接置于池中备用。此时连接的初始化工作已经完成。对于业务请求而言,直接利用连接池中的可用连接,避免了数据库连接的创建和释放,从而缩减了系统整体响应时间。
数据库连接由连接池统一管理,最后由连接池统一对连接进行析构,防止有连接没有析构,导致资源泄露
数据库连接并不是线程安全的,连接池可以防止多个线程同时使用一个连接。
那可不可以一个线程绑定一个线程呢?
这样肯定是可以的,但是如果这样的话,代码的耦合性太高。使用连接池的方式,耦合性低,可修改性更好。
TCP三次握手
Mysql认证三次握手
SQL执行
Mysql的关闭
TCP四次挥手
所以数据库连接一般使用的是长连接,如果每次执行SQL都要新建连接的话,连接和释放的代价太大。
数据库连接池使用的也是长连接。
从连接池获取或创建可用连接;
使用完毕后,把连接返回给连接池;
在系统关闭前,断开所有连接并释放连接占用的系统资源;
连接池和线程池的区别
连接池可以和线程池一起使用,一般连接池连接数量和线程池线程数量一致。
析构连接池的时候,需要注意析构的顺序:
Mysql和redis
设置启用自动重连
my_bool reconnect = true;
mysql_options(m_mysql, MYSQL_OPT_RECONNECT, &reconnect); // 配合mysql_ping实现自动重连
检测连接是否正常
int STDCALL mysql_ping(MYSQL *mysql);
描述:
检查与服务端的连接是否正常。连接断开时,如果自动重新连接功能未被禁用,则尝试重新连接服务
器。该函数可被客户端用来检测闲置许久以后,与服务端的连接是否关闭,如有需要,则重新连接。
返回值:
连接正常,返回0;如有错误发生,则返回非0值。返回非0值并不意味着服务器本身关闭掉,也有可能
是网络原因导致网络不通。
使用之前检测连接是否可用
使用过程中出现连接异常则释放异常
下一次使用该连接的时候如果发现连接不可用则重新初始化
连接数设置成多少比较合适?
一般经验公式,如果CPU核数是N
执行同一个任务:
单个CPU的饱和线程数 = 1 / (计算时间 / 总的任务时间)
最终线程数 = 单个CPU的饱和线程数 * CPU核数
上面的这些,仅仅是经验公式,最终还是要根据具体业务结合在一起,经过大量测试,设置适合的参数。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习