最近在学习性能测试时,注意到数据库连接池对系统性能的影响,所以在网上查看资料后,做了个简单的总结。
一、什么是数据库连接池
数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对连接池中的连接进行申请、使用和释放等操作。
二、数据库传统连接机制和数据库连接池连接机制的差别
传统连接机制:
1.通过数据库驱动程序连接数据库
2.执行sql语句
3.断开数据库连接
连接池连接机制:
1.程序初始化时创建连接池
2.使用时向数据库申请连接
3.使用完成后,将连接返回连接池,以便下次使用
4.程序退出时,释放连接池
三、查看数据库连接
1.SHOW PROCESSLIST:查看数据库打开的连接信息
2.SHOW VARIABLES LIKE 'MAX_CONNECTIONS':查看当前的最大连接数
3.SET GLOBAL MAX_CONNECTIONS=100:设置最大连接数
4.SHOW STATUS LIKE '%THREADS%':
含义:Threads_cached:当已有连接不再使用之后,mysql server不是直接断开连接,而是将已有连接转入到thread_cache中,以便下次在有create thread的需求时,可以在cache中复用,提高性能,降低资源消耗,当然,如果已经有了中间件或者其他的连接池管理,那么这个参数就没有那么重要了,但是如果没有其他的连接池管理,那么优化这个参数还是可以得到不错的回报的。
Threads_connected:打开的连接数,thread_connected等于show processlist的连接数量
Threads_created:新创建的thread(根据官方文档,如果thread_created增大迅速,需要适当调高thread_cache_size)
Threads_running:代表正在运行的thread
5.SHOW VARIABLES LIKE 'connect_timeout':查看数据库连接超时时间(单位:秒)
SET GLOBAL connect_timeout=10:设置数据库连接超时时间(单位:秒)
6.SHOW VARIABLES LIKE 'wait_timeout':查看数据库等待连接超时时间(单位:秒),超过时间数据库会杀死连接
SET GLOBAL wait_timeout=10:设置数据库等待超时时间(单位:秒)
四、数据库连接数持续偏高的原因
1.耗时长的sql较多,导致连接时间增大,导致占用连接数
解决:查看数据库慢查询日志slow_query_log,找到查询耗时长的sql,对sql进行优化(添加索引、优化sql语句等)
2.大量连接请求,导致数据库连接数不够用
解决:适当增加数据库最大连接数或连接池的数量
3.sql语句执行完成后,未及时关闭连接,导致连接数占用和内存溢出
解决:sql执行完成后,及时关闭连接释放资源,将连接返回给连接池(如果有连接池管理)
4.sql语句执行时,程序异常退出,导致占用连接数
解决:手动杀死无用连接,或适当减小wait_time