连接太多 Nodejs + mysql2/promise
Posted
技术标签:
【中文标题】连接太多 Nodejs + mysql2/promise【英文标题】:Too many connections Nodejs + mysql2/promise 【发布时间】:2021-04-25 01:18:43 【问题描述】:我在一个使用 nodejs + mysql2 的项目中工作,有时我收到错误 Too many connections。
我的连接:
import createPool, Pool from 'mysql2/promise';
export async function connect(): Promise < any >
const connection: Pool = await createPool(
host: 'localhost',
port: 3306,
user: 'root',
password: '',
database: 'mendozarq',
connectionLimit: 10
);
return connection;
控制器:
import Response, Request from 'express';
import FieldPacket, Pool from 'mysql2/promise';
import connect from './../../classes/database';
import Personal from './../../models/personal.interface';
export const getAllPersonal = async (req: Request, res: Response) =>
try
const conn: Pool = await connect();
const [personal]: [any[], FieldPacket[]] = await conn.query('SELECT * FROM personal ORDER BY creadoEn DESC');
conn.end();
return res.status(200).json(personal);
catch (error)
return res.status(400).json(
error
);
所以,我的问题是我必须使用 createConnection 而不是 createPool 或者我只需要创建一个我的 conn 实例。
【问题讨论】:
你应用调用connect()
多少次?它应该只调用一次(看起来你正在为每个请求调用它),并从池中选择一个连接。
我为每个请求调用 connect(),所以我只需要为每个控制器调用一次 connect(),还是为每个控制器调用一次?。请给我一些例子。
【参考方案1】:
您应该只调用一次createPool
,然后每次都从池中进行选择。
所以,它应该看起来像这样。创建一个存储池的常量。然后在函数中如果池已经存在则返回池而不调用createPool
。如果不存在,则调用createPool
并返回已创建的池。
import createPool, Pool from 'mysql2/promise';
const globalPool: Pool | undefined = undefined;
export async function connect(): Promise <Pool>
// If the pool was already created, return it instead of creating a new one.
if(globalPool)
return globalPool;
// If we have gotten this far, the pool doesn't exist, so lets create one.
globalPool = await createPool(
host: 'localhost',
port: 3306,
user: 'root',
password: '',
database: 'mendozarq',
connectionLimit: 10
);
return globalPool;
【讨论】:
感谢您的解释!以上是关于连接太多 Nodejs + mysql2/promise的主要内容,如果未能解决你的问题,请参考以下文章