nodejs mysql - Как реализовать pooledConnection в проекте реального мира? - PullRequest
0 голосов
/ 29 января 2020

Я работаю над nodejs с mysql (8.x). Я установил mysql библиотеку из npm.

Я написал код, подобный приведенному ниже.

Файл A - connection.js

const pooledConInfo = { 
    host: 'localhost',
    user: 'user',
    password: 'pw',
    database: 'db',
    insecureAuth : true,
    connectionLimit : 10, 
};
const pooledConnection = mysql.createPool(pooledConInfo);
module.exports = pooledConnection;

Файл B - MemberRouter.js

const con = require('../db/connection');

...

router.get('/api/member', (req, res, nxt) => {
    let rs = Object.assign({}, resForm);
    try {
        con.getConnection((err, connection) => { // #1. Do not want to repeat in every query situation
            if(err) throw err;
            connection.query('SELECT * FROM MEMBER LIMIT ?', 10, (err, result, fields) => {
                connection.release(); // #2. Do not want to repeat in every query situation
                if(err) throw err;
                rs.data = result;
                return res.json(rs);
            })
        });
    } catch (queryException) {
        rs.cause = queryException;
        return res.json(rs);
    }
});

Это работает, но я не верю, что люди используют так.

Это два основных вопроса, которые я хочу задать

  • Самое неприятное, что мне приходится освобождать каждый пул при каждом обратном вызове запроса. Это правильный путь
  • Есть ли хороший шаблон для применения? Я хочу обернуть getConnection и connection.release часть ...

Спасибо

1 Ответ

0 голосов
/ 29 января 2020

Вам не нужно делать connect.release () для пулированного соединения каждый раз, и это делается автоматически

Согласно документации

var mysql = require('mysql');
var pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'example.org',
  user            : 'bob',
  password        : 'secret',
  database        : 'my_db'
});

pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

Это ярлык для pool.getConnection ( ) -> connection.query () -> connection.release () поток кода. Использование pool.getConnection () полезно для совместного использования состояния соединения для последующих запросов. Это связано с тем, что два вызова функции pool.query () могут использовать два разных соединения и выполняться параллельно. Это базовая c структура:

var mysql = require('mysql');
var pool  = mysql.createPool(...);

pool.getConnection(function(err, connection) {
  if (err) throw err; // not connected!

  // Use the connection
  connection.query('SELECT something FROM sometable', function (error, results, fields) {
    // When done with the connection, release it.
    connection.release();

    // Handle error after the release.
    if (error) throw error;

    // Don't use the connection here, it has been returned to the pool.
  });
});

Image from official website u shared

...