npm mysql2:使用promises和连接池时连接太多

时间:2016-12-20 23:06:56

标签: javascript mysql node.js es6-promise mysql2

使用mysql2 / promise模块,我创建了一个这样的连接池:

import mysql from 'mysql2/promise';

async function getConnection() {
    let pool = await mysql.createPool({
        connectionLimit: 10,
        host:'localhost',
        user: 'root',
        database: 'customers'
    });

    return pool.getConnection();
}

export  {
    getConnection
};

在另一个文件中,我可以像这样访问此功能:

import {getConnection} from '../config/database/mysql';

async function getCustomerAddresses(id){
    let conn = await getConnection();

    let [rows, fields] = await conn.execute(
        `SELECT *
        FROM addresses WHERE customer = ?`, [id]);

    conn.release();

    return rows;
}

在多次调用该函数后,我收到以下错误:

连接太多

我做错了什么?是否有更优雅的方式,所以我不必在每个函数中包含getConnection()调用?

2 个答案:

答案 0 :(得分:2)

每次需要新连接时都在创建新池,尽管池最终仍然是GCed连接仍然打开,除非您手动调用.close()。你应该做的是拥有一个单独的池,它将为你管理连接的生命周期:

import mysql from 'mysql2/promise';

const pool = mysql.createPool(params);  
const getConnection = () => pool.getConnection();
export { getConnection } 

答案 1 :(得分:0)

根据我的经验,我相信你的问题就是这段代码

conn.release();

在我的情况下,我将其更改为

conn.destroy();

我刚刚阅读了文档,我认为差异在文档中有解释:

  

游泳池懒洋洋地创建了连接。如果配置池   允许多达100个连接,但只能同时使用5个,   只会建立5个连接。连接也是循环的   循环式,连接从顶部开始   游泳池并返回底部。

而破坏就是这个

  

这将导致立即终止底层套接字。   另外destroy()保证不再有事件或回调   将触发连接。

希望这有帮助。