【问题标题】:How to avoid too many connections error in mode mysql2mysql2模式下如何避免连接过多错误
【发布时间】:2021-01-14 20:33:53
【问题描述】:

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()

home-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.js node-mysql


    【解决方案1】:

    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 请求吃掉多个数据库连接更好。

    【讨论】:

    • 完美,所以问题是我的循环。
    猜你喜欢
    • 2014-11-18
    • 2019-09-13
    • 2011-06-06
    • 2019-04-11
    • 1970-01-01
    • 2014-05-12
    • 2022-10-23
    • 2012-01-11
    相关资源
    最近更新 更多