node.js - 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 }
当我这样做时,我收到一个错误“连接太多”。我该怎么做才能避免这种情况?
解决方案
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 请求吃掉多个数据库连接更好的模式。
推荐阅读
- ios - 如何从firebase读取数据?
- maven - 在创建功能分支时自动创建 Package Feed
- php - ajax成功后无法在div中显示错误文本
- kubernetes - 命名空间“卡住”为终止,我如何删除它
- php - Symfony 3.4 应用程序中的“驱动程序发生异常:找不到驱动程序”
- c++ - C++ 程序没有完全执行迭代
- c# - 无法将“System.String”类型的对象转换为“System.Array”类型的 Oracle 批量插入
- azure-devops - 如何在 Microsoft 托管代理池上的 Azure Pipelines 上实现作业的实际并行执行?
- asp.net - 为什么我的 onClick() 按钮在我的控制器中调用 HttpPost 方法?
- javascript - Angular 6 - 类变量