stealone
Messages postés30Date d'inscriptionsamedi 4 décembre 2010StatutMembreDernière intervention31 mars 2016
-
Modifié par stealone le 4/10/2014 à 23:38
KX
Messages postés16752Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 août 2024
-
4 oct. 2014 à 23:50
Bonjours à tous les apprentis java de la planète Web. mon problème je le pose ainsi:
mon application swing se connectait jusque là à la base de données grâce à ce petit code:
public class DbConnection {
private static Connection connection = null;
private final String dbDriver = "com.mysql.jdbc.Driver";
alors vu que je souhaite que plusieurs utilisateurs se connectent à cette application via différent clients (poste) je me suis dit qu'il faut gérer les privilèges qui leurs sont accordés pour la base de données. J'ai donc décidé de créer une classe qui retourne un objet de type Connetion en fonction des paramètres de connexion que l'utilisateur insères dans le formulaire de connexion et boum les problèmes commencent.
d'abord mon application me renvoie un message du genre "accès denied for user utilisateur using password yes". bref un truc de ce genre, et ce même si je crée un utilisateur avec les mêmes paramètres de connexion au niveau de la base de donnée, ce qui se vérifie dans la table user de la base mysql . je me suis dit que ce n'est pas surement la bonne marche à suivre. fallait donc que j'obtienne un avis de la communauté. Faut-il garder les paramètres de l'utilisateur tels que définis dans le code et oublier les privilèges des utilisateurs ou il y a mieux.
deuxième question: y a t-il un moyen de connaître le nombre d'utilisateurs connectés à un moment 'm' afin d'en informer les utilisateurs sur le trafique dans la base de données? un peu comme ça se fait avec les pages webs? merci d'avance pour vos précieuses réponses.
jordane45
Messages postés38241Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention17 septembre 2024345 4 oct. 2014 à 23:31
Bonjour.
Tu n'as pas besoin de créer des users mysql différents. ..
Ton appli utilisera le même compte de connexion pour tous les clients.
Par contre tu crées une table pour gérer tes People. .
Pour le nb de connectés. .la aussi tu le gère via une table. ..
A chaque connexion tu ajoute une ligne dans la table avec les infos du connecté. ..et tu pourras requêter ta table pour obtenir l'info.
KX
Messages postés16752Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 août 2024127 4 oct. 2014 à 23:50
Bonsoir,
Quelques remarques sur ton code déjà.
Si tu veux faire des singleton fait le sur des objets Datasource, pas sur des Connection, sinon tu vas avoir toujours la même connexion, ce qui risque de te poser plus de problèmes qu'autre chose.
De plus, pour construire ton singleton, il faudrait mettre ton constructeur privé, ça évite qu'il soit instancié.
Notons également que ton getInstance n'est pas thread-safe, tu pourrais utiliser des AtomicReference pour faire ça mieux.
L'appel Class.forName(instance.dbDriver); doit faire une seule fois dans tout le programme, il sert juste à charger la classe en mémoire, il paraît donc maladroit de le mettre dans ta méthode.
Idem pour Logger.getLogger(DbConnection.class.getName()), ce sera toujours le même, il vaut mieux le mettre ailleurs...
Sinon pour revenir aux privilèges de la base de données, ce n'est pas la peine de les gérer toi même, si le droit est insuffisant tu auras des exceptions que tu remonteras à l'utilisateur.
Par contre il faudrait prévoir en effet le cas des différents utilisateurs, avec leur login, mot de passe, et à la limite il serait bien aussi de pouvoir gérer le cas où l'on est plusieurs bases de données.
Tout cela se gère normalement dans un fichier de configuration .properties et tant qu'on y est on mettra un peu de JNDI...
Pour la deuxième question, deux réponses, soit ton appel à la base de données est géré par un serveur qui centralise toutes les requêtes et dans ces cas là il est facile d'incrémenter un compteur quand une requête part et la décrémenter quand le ResultSet arrive. Soit ce sont tes clients qui font directement l'appel à la base de données (c'est pas vraiment l'architecture Java mais admettons) dans ce cas ce sera plus dur de savoir, à part aller taper une requête root (laquelle ?) sur la base de données pour obtenir cette information...