我使用的库: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...
1条答案
按热度按时间db2dz4w81#
文件规定:
pool.getConnection
→connection.query
→connection.release
你不打电话release
但是destroy
,它会立即终止连接,而不是将其释放回池。所以你的游泳池充满了新的连接。另外,考虑到如何仅使用池连接来运行单个查询,您可以使用文档中提到的快捷方式:
这样,所有池管理都将自动完成。