nodejs mysql lib错误“连接太多”

a9wyjsp7  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(389)

我使用的库:mysqljs/mysql
我在mysql服务器上最多有250个连接,但我的应用程序有时会“连接太多”。
当我检查时,mysql服务器只有3个连接使用 show full processlist; 命令
我的代码有问题吗?
app/config/database.json文件

{
    "production": {
        "db1": {
            "multipleStatements": true,
            "host":****,
            "user":****,
            "password":****,
            "database":****,
            "connectionLimit": 190,
            "port": 3306
        }
}

应用程序/模型/索引.js

const mysql = require('mysql')
const config = require('../config/database')

const db1 = mysql.createPool(config[process.env.APP_ENV].db1)
const db2 = mysql.createPool(config[process.env.APP_ENV].db2)
const db3 = mysql.createPool(config[process.env.APP_ENV].db3)
const db4 = mysql.createPool(config[process.env.APP_ENV].db4)

const connections = {
    'db1': db1,
    'db2': db2,
    'db3': db3,
    'db4': db4
}

// Models
const News = require('./News')
const Programs = require('./Programs')

module.exports = {
    News: new News(connections),
    Programs: new Programs(connections)
}

应用程序/模型/新闻.js

class News {
    constructor(connections) {
        this.db = connections;
    }

    getNews(limit, offset) {
        return new Promise((resolve, reject) => {
            this.db.db1.getConnection((err, db1) => {
                if (err) {
                    console.log(err)
                    db1.destroy()
                    reject(err)
                }

                db1.query(query, (err, rows) => {
                    if (err) {
                        console.log(err)
                        db1.destroy()
                        reject(err)
                    }
                    db1.destroy()
                    resolve(rows)
                });
            });
        }); 
    }
}
module.exports = News;

应用程序/控制器/新闻控制器.js

const models = require('../models/index')

class NewsController {

    index (req, res) {
        models.News.getNews(limit, offset).then((result) => {
            res.status(200).send(result);
        }).catch((err) => {
            res.status(503).send(err);
        });
    }

    // more functions that can perform 2 or 3 queries consecutives 
    // with differents model functions.
}
module.exports = NewsController

应用程序/控制器/索引.js

const NewsController = require('./NewsController')

module.exports = {
    NewsController: new NewsController()
    // more controllers...
}

应用程序/路由.js

const express = require('express')
const router = express.Router()
const controllers = require('./controllers')

router.get('/news', (req, res) => {
    controllers.NewsController.index(req, res)
})
// more routes with newscontroller...
db2dz4w8

db2dz4w81#

文件规定: pool.getConnectionconnection.queryconnection.release 你不打电话 release 但是 destroy ,它会立即终止连接,而不是将其释放回池。所以你的游泳池充满了新的连接。
另外,考虑到如何仅使用池连接来运行单个查询,您可以使用文档中提到的快捷方式:

this.db.db1.query(query, (err, rows) => {
  if (err) {
    console.log(err)
    reject(err)
  } else {
    resolve(rows)
  }
});

这样,所有池管理都将自动完成。

相关问题