2016-12-20 9 views
0

Использования модуля mysql2/обещания, я создаю пул соединений, как это:НПЙ mysql2: Слишком много соединений при использовании обещаний и пула соединений

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() в каждую функцию?

ответ

0

Основываясь на моем опыте, я считаю, что ваши проблемы этот код

conn.release(); 

В моем случае, я изменил его на

conn.destroy(); 

Я только что прочитал в документации, и я думаю, что разница разъяснены в документации по этому вопросу:

Connections are lazily created by the pool. If you configure the pool to allow up to 100 connections, but only ever use 5 simultaneously, only 5 connections will be made. Connections are also cycled round-robin style, with connections being taken from the top of the pool and returning to the bottom.

Принимая во внимание, что это

This will cause an immediate termination of the underlying socket. Additionally destroy() guarantees that no more events or callbacks will be triggered for the connection.

Надеюсь, это поможет.

0

Вы создаете новый пул каждый раз, когда хотите новое соединение, и хотя пул в конечном итоге является соединением GCed, все еще открыт, если вы вручную не назовете на него .close(). То, что вам действительно нужно сделать, - это иметь один пул, и он будет управлять жизненным циклом соединений для вас:

import mysql from 'mysql2/promise'; 

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

 Смежные вопросы

  • Нет связанных вопросов^_^