如何避免模式 mysql2 中出现过多连接错误

How to avoid too many connections error in mode mysql2

pool.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 }

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

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 请求占用多个数据库连接更好的模式。