AWS - NODEJS - MYSQL: caduta connessione con mysql

di il
9 risposte

AWS - NODEJS - MYSQL: caduta connessione con mysql

Grazie al contributo vostro e a mie ricerche, sono riuscito finalmente a mettere on line la web application.

Dopo un certo periodo di utilizzo, ho un problema con la connessione di Mysql che “cade” inspiegabilmente.

Ho guardato il file config.json, che riporto, e sono intervenuto sul parametro "expiresIn" allungando il tempo.

Leggendo alcuni post sull'argomento, impostando il valore a 365d la connessione sarebbe rimasta attiva per 365 giorni.

Allo stato dei fatti, ciò non è perchè dopo un periodo abbastanza breve la connessione cade.

Potete aiutarmi a risolvere il problema ?

Ovviamente questa criticità mi blocca nella messa in test on line.

grazie

Moreno

{
    
    "host": "localhost",
    "user": "miauser",
    "password": "miapwd",
    "database":"miodb",
    "port":3306,
    "dialect": "mysql",
    "underscored": 0,
    "pool": {
      "max": 5,
      "min": 0,
      "acquire": 30000,
      "idle": 10000
    },
     
    "secret": "mysecret is zoe",
    "expiresIn": 365d, 
    "emailFrom": "miaemail",
    "smtpOptions": {
        "host": "email-smtp.eu-south-1.amazonaws.com",
        "port": 587,
        "auth": {
            "user": "AKIAV4ER58KCHFFLD15X",                            
            "pass": "BAZ9iQimY9mlnE/LWG9ES1CMtV+d1jS+ddCMIKUMBMIO"
        },
        "tls": {
            "rejectUnauthorized": false
        },
        "secure": false
    }
    
    
    
}

9 Risposte

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    12/10/2023 - morenog ha scritto:


    Dopo un certo periodo di utilizzo, ho un problema con la connessione di Mysql che “cade” inspiegabilmente.

    Una domanda: perché dovresti tenere una connessione aperta in modo permanente con MySQL?

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    Grazie Alka per l'intervento.

    Ho preso atto del codice come è stato scritto.

    Al termine dell'operazione non vedo comandi per la disconnessione e nessun comando di connessione prima di eseguire la query.

    Ritengo anchio che sarebbe più sicuro un'operatività che prevedesse di disconnettere il backend dal database eseguita l'operazione richiesta e ovviamente attivare la connessione un attimo prima di eseguire la query, ma non so come fare.

    per il backend utilizzo nodejs e utilizzo come linguaggio typescript.

    Spero di aver chiarito il mio problema.

    Grazie

    Moreno

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    12/10/2023 - morenog ha scritto:


    Al termine dell'operazione non vedo comandi per la disconnessione e nessun comando di connessione prima di eseguire la query.

    In che senso? Se non hai codice che apre e chiude la connessione al database, come fai a operare sopra lo stesso?

    Posta una parte del programma così cerchiamo di capire.

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    Grazie Alka

    ecco il metodo di lettura per id

    in   db.js  faccio la connessione al db

    const config = require("./config.json");
    const mysql = require('mysql2');
    
    const Sequelize = require('sequelize')
    const sequelize = new Sequelize(
        config.database,
        config.user,
        config.password,
      {
        host: config.host,
        dialect: config.dialect,
        operatorsAliases: 0,
        pool: {
          max: config.pool.max,
          min: config.pool.min,
          acquire: config.pool.acquire,
          idle: config.pool.idle
        }
      }
    );
    
    let db;
    
    //    variante per connettere sia localhost che in produzione su heroku
    
    if(process.env.CLEARDB_DATABASE_URL) {
      db = mysql.createConnection(process.env.CLEARDB_DATABASE_URL)
    } else {
        db = mysql.createConnection({
          host: config.host,
          user: config.user,
          password: config.password,
          database:config.database,
          port:config.port
      });
    }
    
    
    
    // connettere Mysql   utilizzato con create connection
    
    db.connect(err=> {
      if(err) {
          console.log(err,'errore in connessione Mysql');
      }else {
          console.log('Mysql connected con successo');
      }
    })
    

    poi nei metodi di gesione tabelle faccio le query

    exports.getbyid = (req,res)=> {
        
          let id = req.params.id;
          const strsql = strSql + ' where `bigliettos`.`id` = ' + id;
          db.query(strsql,(err,result)=> {
            if(err) {
                 res.status(500).send({
                    message: `2 errore il lettura bigliettos for id ${id}- errore: ${err}`,
                    rc: 'kk',
                    data:null
                });
                return;
            }
            
            if(result.length>0) {
                 res.status(200).send({ 
                    message:`situazione attuale per evento id: .....  ${id}`,
                    rc: 'ok',
                    data:result[0]
                });                    
            }else {
                res.status(200).send({
                    message: `nessun evento presente for id: ${id}`,
                    rc: 'nf',
                    data:null
                });
            }
        });  
    }

    In questo metodo eseguo solo la query senza effettuare la db.connect e db.close

    ho modiificato un metodo in cui effettuo la connessione prima di effettuare la query e la disconnessione alla fine.

    dimmi se può andare bene.

    Se corretta, devo effettuare la modifica su tutti i metodi di tutti i controller per effettuare la “connessione” prima di eseguire le query e la "disconnessione" alla fine del metodo.

    exports.getAll = (req,res)=> {
        db.connect();                <--------- effettuo la connessione prima di operare
        let strsql = strSql; // 'select * from bigliettos';
        db.query(strsql,(err,result)=> {
            if(err) {
               res.status(500).send({
                    message: `3 errore il lettura all bigliettos - erro: ${err}`,
                    data:null
                });
                return;
            }
            if(result.length>0) {
                 res.status(200).send({ 
                    message:'Situazione attuale ',
                    rc: 'ok',
                    number:  result.length,
                    data:result
                });                    
            }else {
                res.status(200).send({ 
                    message: `nessun evento presente `,
                    rc: 'nf',
                    data:null
                });                    
            }
    
        });
        db.end();  <----------------  effettuo la disconnessione a fine metodo
    }

    Pensi possa andare bene ?

    grazie

    Moreno

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    12/10/2023 - morenog ha scritto:


    Se corretta, devo effettuare la modifica su tutti i metodi di tutti i controller per effettuare la “connessione” prima di eseguire le query e la "disconnessione" alla fine del metodo.

    Io procederei in questo modo.

    Fai una prova e vedi se questo risolve definitivamente.

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    Buongiorno Alka

    Grazie per la paziente assistenza.

    Volevo chiederti se esiste nell'istanza nginx, un log di mysql per vedere il motivo per cui la connessiona cade.

    in altre applicazioni, il codice viene eseguito come ti ho prospettato e cioè

    • prima di eseguire la query, attivo la connessessione  con db.connect();
    • eseguo la query
    • a completamento della query eseguo la disconnessione con db.end();

    Questo tipo di attività, replicata su molte query può essere penalizzante e rallenatare l'applicazione ?

    Grazie

    Moreno

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    13/10/2023 - morenog ha scritto:


    Volevo chiederti se esiste nell'istanza nginx, un log di mysql per vedere il motivo per cui la connessiona cade.

    Non sono purtroppo un esperto massimo di nginx per aiutarti in questo dettaglio. :)

    13/10/2023 - morenog ha scritto:


    Questo tipo di attività, replicata su molte query può essere penalizzante e rallenatare l'applicazione ?

    No, perché la connessione è una risorsa a disponibilità limitata, e come tale va acquisita quando serve e rilasciata (tramite codice) il prima possibile rendendola disponibile ad altre operazioni, altrimenti per poco guadagno di tempo (che si risolve con un “connection pool”) il rischio è quello di esaurire le connessioni disponibili e non riuscire a servire più utenti, o condividere tra diversi thread di utenti separati un oggetto che non è “thread safe” (e tipicamente la connessione non lo è).

    C'era un post dell'utente migliorabile però è scomparso: peccato perché riassumeva egregiamente tutto quello che c'è da dire a riguardo, ma non so perché è scomparso. :|

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    Ciao Alka

    leggendo la tua ultima osservazione, ho ricontrollato il codice della db.js in cui effettuo la connessione a mysql.

    c'è una definizione relativa al pool. Può essere completa e sufficiente per eseguire correttamente la connessione e gestire in maniera corretta le eventuali attivitò di connessione e disconnessione all'interno dei metodi ?

    const config = require("./config.json");
    const mysql = require('mysql2');
    
    const Sequelize = require('sequelize')
    const sequelize = new Sequelize(
        config.database,
        config.user,
        config.password,
      {
        host: config.host,
        dialect: config.dialect,
        operatorsAliases: 0,
        pool: {
          max: config.pool.max,
          min: config.pool.min,
          acquire: config.pool.acquire,
          idle: config.pool.idle
        }
      }
    );
    
    let db;
    
    //    variante per connettere sia localhost che in produzione su heroku
    
    if(process.env.CLEARDB_DATABASE_URL) {
      db = mysql.createConnection(process.env.CLEARDB_DATABASE_URL)
    } else {
        db = mysql.createConnection({
          host: config.host,
          user: config.user,
          password: config.password,
          database:config.database,
          port:config.port
      });
    }
    
    
    
    // connettere Mysql   utilizzato con create connection
    
    db.connect(err=> {
      if(err) {
          console.log(err,'errore in connessione Mysql');
      }else {
          console.log('Mysql connected con successo');
      }
    })
    
    
    // creo connessione a mysql con pool 
    
    let pool;
    pool = mysql.createPool({
      connectionLimit: 300,
      host: config.host,
      user: config.user,
      password: config.password,
      database:config.database,
      port:config.port
    });
    
    
    
    db.Sequelize = Sequelize;
    db.sequelize = sequelize;
    
    
    // model di tutte le tabelle utilizzate
    
    db.user = require("./models/user.js")(sequelize, Sequelize);
    db.socio = require("./models/socio.js")(sequelize, Sequelize);
    

    Grazie

    Moreno

  • Re: AWS - NODEJS - MYSQL: caduta connessione con mysql

    14/10/2023 - morenog ha scritto:


    c'è una definizione relativa al pool. Può essere completa e sufficiente per eseguire correttamente la connessione e gestire in maniera corretta le eventuali attivitò di connessione e disconnessione all'interno dei metodi ?

    Direi di sì, ma se vuoi averne la certezza assoluta (perché non ho la conoscenza globale del tuo progetto e di come è strutturato) puoi sempre fare dei test e simulare delle chiamate per verificare la correttezza e le performance della tua applicazione, prendendo così in esame tutti gli aspetti, dalla connessione alla logica.

Devi accedere o registrarti per scrivere nel forum
9 risposte