2016-12-20 4 views
0

Mit dem mysql2/Versprechen Modul, ich bin ein Connection-Pool wie folgt zu schaffen:npm mysql2: Zu viele Verbindungen, wenn Versprechungen und einen Verbindungspool

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 
}; 

In einer anderen Datei, ich bin diese Funktionalität zugreifen wie dies:

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; 
} 

Nachdem die Funktion ein paar mal anrufen, ich bin immer die folgende Fehlermeldung:

Zu viele Verbindungen

Was mache ich falsch? Und gibt es einen eleganteren Weg, so muss ich den Aufruf von getConnection() nicht in jeder Funktion enthalten?

Antwort

0

Aufgrund meiner Erfahrung, ich glaube, das Code, dass Ihre Probleme

conn.release(); 

In meinem Fall ist, habe ich es zu

conn.destroy(); 

ich die Dokumentation lesen gerade und ich denke, der Unterschied ist, erklärt in der Dokumentation durch diese:

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.

Während zerstören ist dies

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.

Hoffe, das hilft.

0

Sie schaffen neue Pool jedes Mal, wenn Sie neue Verbindung möchten, und obwohl Pool schließlich ist GCed Verbindung ist noch offen, wenn Sie manuell .close() auf es nennen. Was Sie wirklich tun sollten, ist, einen einzigen Pool zu haben, und es wird Verbindungen Lebensdauer für Sie verwalten:

import mysql from 'mysql2/promise'; 

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