首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点MySQL连接池-等待数据库启动

问节点MySQL连接池-等待数据库启动
EN

Stack Overflow用户
提问于 2020-01-15 20:35:48
回答 3查看 5.4K关注 0票数 3

如何检查MySQL数据库是否已准备好从Node MySQL连接池进行某些查询?

我有一个码头环境,里面有集装箱:

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

数据库容器运行MySQL数据库。api容器连接到该数据库。这三个容器同时启动。web服务器容器在0,5s之后打开。api容器是在2s之后打开的。数据库服务器在20多岁后就可以使用了。

当前,api试图在数据库启动和运行之前访问数据库的表。这会导致诸如拒绝连接之类的错误。下面的代码段总是以“错误查询数据库!”消息结束。当MySQL数据库尚未启用时:

代码语言:javascript
复制
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!');
    }
});

正在使用的版本:

代码语言:javascript
复制
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之外的数据库就绪情况,可能会使用用于查询的连接池。这有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-16 01:16:51

重试与setTimeout()连接

(答案用Javascript而不是打字记录)

代码语言:javascript
复制
'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();

下面是我的测试结果:

代码语言:javascript
复制
$ 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();

票数 1
EN

Stack Overflow用户

发布于 2020-01-16 16:35:14

您的API应该尝试使用超时和一定的连接尝试阈值连接到数据库。但是,对于这种情况,有现成的解决方案。

尝试使用等待mysql模块。

waitForMy =要求‘等待-mysql’配置=用户名:用户密码:传递安静:真正的查询:'SELECT 1‘waitForMy.wait(配置)

票数 0
EN

Stack Overflow用户

发布于 2020-03-14 22:42:22

这里有一个变化,但不需要mysql池。我正在我的服务器上使用这个,它确实有效:

代码语言:javascript
复制
const mysql = require('mysql')
var db // global, to use later to db.query
var dbInfo = {
  host     : 'example.org',
  database : 'some_database',
  user     : 'bob',
  password : 'secret'
}

function connectToDb(callback) {
  const attemptConnection = () => {
    console.log('Attempting to connect to db')
    dbInfo.connectTimeout = 2000 // same as setTimeout to avoid server overload 
    db = mysql.createConnection(dbInfo)
    db.connect(function (err) {
      if (err) {
        console.log('Error connecting to database, try again in 1 sec...')
        db.destroy() // end immediately failed connection before creating new one
        setTimeout(attemptConnection, 2000)
      } else {
        callback()
      }
    })
  }
  attemptConnection()
}

// now you simply call it with normal callback
connectToDb( () => {
  console.log('Connection successfully')
  // do some queries
  db.query(..)
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59759182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档