Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Apenas uma thread mysql

Olá Pessoal, tenho uma api que consulta no mysql os dados. Atualmente eu abro uma instância de conexão, executo a query e fecho ela depois. Porém, tendo muitos acessos aparece problema de 'too many connections'.

Agora então, eu crio o objeto de conexão do mysql e importo ele nas rotas com o require e nunca fecho a conexão após a query, ou seja, estou trabalhando sempre na mesma thread de conexão.

Isso tem algum impacto de alocação de memória ou algum problema ?

db.js

var mysql = require('mysql');
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'root',
    database : 'db_banco',
    port: 8889
});

connection.connect(function(err) {
    if (err) throw err;
});

module.exports = connection;

Arquivo da rota: /teste

var conexao = require('../infra/db.js');

module.exports = (app) => {

    app.get('/teste', (req,res) => {

        var consultaDao = new app.infra.consultaDao(conexao);

        consultaDao.teste((erro,data) => {

            if(erro)
            {
                console.log(erro);
            }

            res.json(data);
        })

    })
}

Ao executar o comando no mysql " show status where variable_name = 'Threads_connected' " o retorno vem sempre 1 thread conectada. Eu gostaria de trabalhar assim, dessa forma com apenas 1 conexão e nunca fechar ela, mas gostaria de saber se é a maneira correta e se isso pode prejudicar a longo prazo com grande acesso de usuários em minha aplicação.

3 respostas

Fala aí Diego, beleza? Não recomendo essa implementação, manter o MySQL sempre conectado e rodando tudo em uma única thread (por questões de performance, escalabilidade e paralelismo).

Acredito que a melhor opção seja você trabalhar com Pool de conexões (geralmente é o que a galera faz por aí).

Espero ter ajudado.

Fala Matheus, beleza ?

Eu alterei meu código, mas continuo importando ele com o require e nunca fechando. Veja se estou fazendo de forma correta:

db.js

const mysql = require('mysql');
const config = require('../config');

const conn = mysql.createPool({
    host: config.host,
    user: config.user,
    password: config.password,
    database: config.database,
    port: config.port,
    connectionLimit : 50
});

conn.getConnection((err) => {
    if(err) throw err;
    console.log('\x1b[36m%s\x1b[0m','Mysql Ativo');
})

module.exports = conn;

Arquivo da rota: '/teste'

var conexao = require('../infra/db.js');

module.exports = (app) => {

    app.get('/teste', (req,res) => {

        var consultaDao = new app.infra.consultaDao(conexao);

        consultaDao.teste((erro,data) => {

            if(erro)
            {
                console.log(erro);
            }

            res.json(data);
        })

    })
}
solução!

Fala aí Diego, agora sim, não vejo problema nessa implementação.

Você limitou as conexões em 50 instâncias, mais que isso não deve ser possível, o pool do MySQL irá gerenciar tudo isso.

Espero ter ajudado.