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