常见的生产应用中我们一般都是用数据库连接池来做MySQL连接管理,因为它非常方便,不需要我们手动处理连接,只需要在使用的时候取出一个连接,使用完成之后自动被连接池托管。那我们取出一个连接直接使用的时候,连接池如何做到连接保活的?
那为了解决这个问题,一般都是采用心跳的方式,常见的有以下两种:
作为客户端,如果想保持自己的连接一直活着,那么就发送ping命令,这样MySQL服务端收到这个命令之后回复:mysqld is alive
就代表MySQL服务端是存活的,同时对于MySQL来说它接收到了客户端的ping命令,那就代表客户端还活着,此时MySQL就不应该断开这个连接。
常见的有以下两种:
select 1;
select version();
这种方式的好处就是像执行SQL语句那样执行,非常方便。
ping模式
和select模式
到底有什么区别呢?
ping模式
不会进行复杂的词法分析,语法分析等,直接快速进行命令响应处理。select模式
会经过一系列mysql sql执行的步骤,最后还得执行慢查询,事务提交等,这个过程下来耗费的时间比较长。ping模式
只能用MySQL提供的API或者mysqladmin工具才能发送ping命令到MySQL服务端。而select模式
是可以通过MySQL API或者MySQL交互式终端都能执行select查询。因为ping模式
执行速度快,对于追求性能的程序推荐使用这种模式。另外在使用select模式
的时候,推荐优先使用select 1
这种查询。
常见的生产项目,比如用druid来管理的数据源,一般都是用select version()
来做心跳保活的。
select version()
这种方式有一个缺点就是当连接因为配置不恰当导致被MySQL服务端中断,那么客户端在执行这条SQL语句的时候就会报错,这样会影响程序执行效率。因此保活的前提一定是配置正确的前提下,这个一定要在本地或者测试环境测试好。