首页 > 解决方案 > mysql2模式下如何避免连接过多错误

问题描述

池.js

import mysql from 'mysql2'
import { dbusername, dbpassword, dbname, host } from './config'

const pool = mysql.createPool({
    host: host,
    user: dbusername,
    password: dbpassword,
    database: dbname,
    connectionLimit: 214000,
    waitForConnections: true,
})
export const promisePool = pool.promise()

主页-route.js

import { promisePool } from '../pool'

router.post('/', async (request, res, next) => {
    const data = request.body
    const loop = await data.map(async (i, index) => {
        try {
            const row = await promisePool.execute(
                'SELECT * FROM sheet'
            )
        } catch (error) {
            console.log('mysql error', error)
        }
    })

    res.json({ message: 'ok' })
})

export { router as default }

当我这样做时,我收到一个错误“连接太多”。我该怎么做才能避免这种情况?

标签: node.jsnode-mysql

解决方案


214000 对于连接限制来说太高了。坚持使用 10,直到您可以在部署环境中测试应用程序并从那里进行调整。

您的问题是 map 与异步函数并不真正兼容。如果你检查循环,你会发现它充满了承诺。每个 Promise 都可能从池中获取一个连接来执行 sql 语句。

而不是使用 map,只需使用与 await 兼容的 for 循环。

for(const d of data) {
    try {
        const row = await promisePool.execute('SELECT * FROM sheet');
        ..do something with the row
    } catch (error) {
        console.log('mysql error', error)
    }
}

这确实意味着每个 SQL 语句将串行执行而不是并行执行,但这通常是比允许一个 http 请求吃掉多个数据库连接更好的模式。


推荐阅读