MySQL Error: Handshake inactivity timeout in Node.js MYSQL module错误


<!–

–>

MySQL Error: Handshake inactivity timeout in Node.js MYSQL module错误

最近在使用 Node.js MYSQL 模块连接数据库时,经常会出现 “ Error: Handshake inactivity timeout” 的错误提示。这个问题对于使用 Node.js 进行Web开发的开发者来说并不陌生,这篇文章将介绍该问题的原因和解决方法。

阅读更多:

问题原因

要理解这个错误,首先得了解 的握手过程。在 MySQL 建立连接时,客户端会向服务器发送一个握手请求(handshake)。服务器接收到这个请求后,会返回一个 SSL 证书和服务器的版本等信息给客户端,客户端收到这个信息后,会判断是否需要 SSL 加密,如果需要,则继续发送 SSL 请求,否则,客户端会将解析后的握手信息发送回给服务器确认,之后客户端和服务器才能正常通信。

(adsbygoogle = window.adsbygoogle || []).push({});

那么,为什么会出现 “Handshake inactivity timeout” 的错误呢?其实,这个错误提示的意思是 MySQL 客户端在规定时间内没有收到服务器的握手回应。每个 MySQL 服务器都有一个默认的超时时间(默认是10S),如果超过了超时时间仍未收到客户端的握手回应,服务器就会关闭连接,这时就会出现这个错误。

通常出现这个问题的原因是由于MySQL服务器过载或者网络延迟问题导致握手过程一直未能完成。

解决方法

要解决这个问题,有以下几种方式:

1. 调整超时时间

可以在 Node.js 代码中使用timeout选项调整超时时间,代码示例:

const connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'secret',
  database : 'my_db',
  timeout  : 60000  // 修改超时时间为60秒
});

2. 调整 MySQL 服务器的超时时间

可以在 MySQL 服务器上修改超时时间,使用以下命令修改:

SET GLOBAL wait_timeout=600;  -- 可以增加 wait_timeout 值

3. 使用连接池

使用连接池是解决这个问题的一个很好的方法。连接池是一组已经连接到数据库的客户端,这些客户端可以重复使用,从而避免了每次创建新的数据库连接,也减少了握手的次数。以下是一个使用连接池的示例:

(adsbygoogle = window.adsbygoogle || []).push({});

const pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'localhost',
  user            : 'root',
  password        : 'secret',
  database        : 'my_db'
});

pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

总结

“Handshake inactivity timeout” 错误提示是由于 MySQL 客户端在规定时间内没有收到服务器的握手回应。要解决这个问题可以通过调整超时时间、调整 MySQL 服务器的超时时间,或者使用连接池来避免每次都建立新的连接的方式。关于 Node.js + MySQL 的开发问题,了解这个错误原因和解决方法是非常重要的。