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