Bonjour,

j'ai un bot discord que je souhaiterai faire travailler avec une base de donnée mysql. Ma base fonctionne s'il y a peut de membre à gérer (une douzine ça passe), mais dés que je dépasse cette douzaine le programme perds connaissance.
Je comprend la base du soucis, il s'agit d'un probléme entre le nombre de connection possible, le nombre de requête, une gestion de l'asynchrone pas bien maitrisé.
Pourriez vous m'aider

Ce que je fais

Le programme marche s'il y a peu de travail à faire

const mysql = require('mysql');

global.mysql_con = mysql.createPool({
    host: config.db_host,
    user: config.db_user,
    password: config.db_password,
    database: config.db_name,
    connectionLimit: 20,
});
let  users = client.users.cache;
    for await (let usr of users.values())
    {

        var research= new Promise((resolve,reject)=>
        {   console.log(usr.username);
            mysql_con.getConnection((err, connection) => {
                if (err) {
                    if (err.code === 'PROTOCOL_CONNECTION_LOST') {
                        console.log('Database connection was closed.')
                    }
                    if (err.code === 'ER_CON_COUNT_ERROR') {
                        console.log('Database has too many connections.')
                    }
                    if (err.code === 'ECONNREFUSED') {
                        console.log('Database connection was refused.')
                    }
                }

                if (connection)
                {
                    mysql_con.query("SELECT * FROM `e107_discord_user`  WHERE `real_id`="+usr['id'], function (err, result, fields) {
                        if (err) throw err;
                        connection.release()
                        if(typeof result!==undefined && result)
                        {
                            mysql_con.end()
                            resolve(result)
                        }

                    });
                    console.log("j'ai cherché "+usr.username)

                }
            })
        })

        research.then((value)=>{
            console.log("on m'a demandé "+usr.username)
            if(value.length===0)
            {
                var insert= new Promise((resolve,reject)=>
                {
                    mysql_con.getConnection((err, connection) => {
                        if (err) {
                            if (err.code === 'PROTOCOL_CONNECTION_LOST') {
                                console.log('Database connection was closed.')
                            }
                            if (err.code === 'ER_CON_COUNT_ERROR') {
                                console.log('Database has too many connections.')
                            }
                            if (err.code === 'ECONNREFUSED') {
                                console.log('Database connection was refused.')
                            }
                        }

                        if (connection)
                        {

                            var entry = `'','${usr['id']}','${escape(usr.username)}','NULL','${Date.now()}','${new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')}','out','inc','inc','0','5'`
                            var sql="INSERT INTO `e107_discord_user` (id,real_id, name,nickname, time,date, salon, game , type , alert ,jeton) VALUES ("+entry+")"
                            mysql_con.query(sql, function (err, result, fields) {
                                if (err) throw err;
                                connection.release()
                                if(typeof result!==undefined && result)
                                {
                                    mysql_con.end()
                                    resolve(result)
                                }

                            });

                        }
                    })
                })
                insert.then((value)=>{
                    if (value.affectedRows==1)
                    {
                        console.log("j'ai pas "+usr.username)
                        let monkey={"real_id":usr['id'], 'name': escape(usr.username), "nickname":null}
                        monkeys_list[usr.id]=monkey
                    }

                });

            }
            else{
                console.log("j'ai  "+usr.username)
                let monkey={"real_id":usr['id'], 'name': escape(usr.username), "nickname":null}
                monkeys_list[usr.id]=monkey

            }
        });

Ce que je veux

Je souhaiterai que le programme puissent encaisser une charge de travail plus importante, la notion de temps n'est pas prioritaire

Merci de votre aide

2 réponses


flo3376
Auteur

j'ai cette variante qui marche, mais pour la mémoire je suis pas certain que ce soit bon

let  users = client.users.cache;
    var i=0
    var mysql_con=[]
    for await(let usr of users.values())
    {

        var connect= new Promise((resolve,reject)=>
        { 
            console.log(usr.username);
            console.log("création du connecteur "+i)
            i++
            mysql_con[i] = mysql.createConnection({
                host: config.db_host,
                user: config.db_user,
                password: config.db_password,
                database: config.db_name,
                connectionLimit: 20,
            });resolve(i)
        })
        connect.then((i)=>{

            mysql_con[i].query("SELECT * FROM `e107_discord_user`  WHERE `real_id`="+usr['id'], function (err, result, fields)
            {
                if (err) throw err;

                if(typeof result!==undefined && result)
                {
                    console.log("j'ai cherché "+usr.username)
                    console.log("on m'a répondu ")
                    console.log("sur le connecteur "+i)
                    console.log(result)
                    console.log(result.length)
                    if(result.length===0)
                    {
                        var entry = `'','${usr['id']}','${escape(usr.username)}','NULL','${Date.now()}','${new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')}','out','inc','inc','0','5'`
                        var sql="INSERT INTO `e107_discord_user` (id,real_id, name,nickname, time,date, salon, game , type , alert ,jeton) VALUES ("+entry+")"
                        mysql_con[i].query(sql, function (err, result, fields) {
                            if (err) throw err;
                            if(typeof result!==undefined && result)
                            {
                                console.log("j'ai créé "+usr.username)
                                console.log("on m'a répondu ")
                                console.log(result)
                                console.log(result.length)
                                mysql_con[i].end()
                                delete mysql_con[i]

                            }

                        });
                    }
                    else
                    {
                        mysql_con[i].end()
                        delete mysql_con[i]
                    }
                }

            })
        })
        }

Pourquoi tu boucle sur tout tes users pour te connecter a ta DB? ta connection doit etre ouverte une seul fois, au début de ton app, pas pour chaque user de ton server.