mysql - Node MySQL 连接池 - 等待数据库启动

标签 mysql node.js connection-pooling

如何检查 MySQL 数据库是否已准备好接受来自 Node MySQL 连接池的某些查询?

我有一个由三个容器组成的 Docker 环境:

  • 容器 1:网络服务器
  • 容器2:api
  • 容器 3:数据库

数据库容器运行 MySQL 数据库。 api 容器连接到该数据库。所有三个容器同时启动。 Web 服务器容器在 0.5 秒后启动。 2 秒后 api 容器启动。 20秒后数据库服务器启动。

目前,API 会在数据库启动并运行之前尝试访问数据库的表。这会导致诸如连接被拒绝之类的错误。以下代码段始终以消息“查询数据库时出错!”结束。当MySQL数据库尚未启动时:

const sql: string = 'SELECT * FROM sometable;';
MySQL.createPool({
    connectionLimit: 10,
    acquireTimeout: 30000,
    waitForConnections: true,
    database: 'mydatabase',
    host: 'localhost',
    multipleStatements: true,
    password: 'mypassword',
    user: 'root',
}).query(sql, (err, result) => {
    if (result) {
        console.log('Successfully queried database.');
    } else {
        console.log('Error querying database!');
    }
});

使用的版本:

OS: Ubuntu 19.10
Node: v13.6.0
MySQL (Node API): "@types/mysql": "2.15.8" and "mysql": "2.17.1"
MySQL (Docker Database): mysql:5.7.28
TypeScript: 3.7.4

我想检查(并等待)API 中的数据库准备情况,可能使用我用于查询的连接池。这可能吗?

最佳答案

重试使用 setTimeout() 连接:

(用 Javascript 而非 typescript 回答)

'use strict';

const dbpool = require('mysql').createPool({
    connectionLimit: 10,
    acquireTimeout: 30000,
    waitForConnections: true,
    database: 'mydatabase',
    host: 'localhost',
    multipleStatements: true,
    password: 'mypassword',
    user: 'root',
});

const sql = 'SELECT * FROM sometable;';

const attemptConnection = () =>
  dbpool.getConnection((err, connection) => {
  if (err) {
    console.log('error connecting. retrying in 1 sec');
    setTimeout(attemptConnection, 1000);
  } else {
    connection.query(sql, (errQuery, results) => {
      connection.release();
      if (errQuery) {
        console.log('Error querying database!');
      } else {
        console.log('Successfully queried database.');
      }
    });
  }
});

attemptConnection();

这是我的测试运行:

$ sudo service mysql stop; node test.js & sudo service mysql start
[1] 24737
error connecting. retrying in 1 sec
error connecting. retrying in 1 sec
$ Successfully queried database.

仅供引用,程序永远不会结束,因为它需要dbpool.end();

关于mysql - Node MySQL 连接池 - 等待数据库启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59759182/

相关文章:

php - 您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 '' 附近使用的正确语法

node.js - Inno Setup 安装程序无法运行子安装程序刚刚安装的应用程序(无法运行 Node。创建进程失败)

mysql - 什么时候应该在 node.js mysql 中使用连接池?

java - Tomcat 连接池中的基本问题

php - 将数据库中的数据显示给特定用户(使用角色?)

应用程序在服务器上运行查询时出现 MySQL 语法错误,但在工作台中运行时却没有

mysql - 使用数据透视表查询同一个表

node.js - 在 ubuntu 上安装 coffee-script 可以正确安装所有文件,但命令行不起作用

javascript - ThreeJS、Websockets 和 NodeJS 客户端/服务器实验

performance - Azure Servicebus 中继性能