[Conception][Client/Serveur][Multi-Thread] Serveur/ Fcts synchronisées
Salut,
Je voudrais créer une “couche” entre le client et la BD afin de pouvoir la modifiée sans avoir à modifier les clients. Cette couche(serveur) contiendrais, entre autre, les fonctions d’accès à la BD.
CLIENT < -- > SERVEUR < -- > BD
Le serveur ne devient-il pas comme un “goulot d’étranglement” (bottle-neck) ?
Exemple de fct)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public SYNCHRONIZED ResultSet getVendeur(int idVendeur){
try{
Statement stm = maConnection.createStatement();
String query = "SELECT * FROM vendeurs WHERE id= + idVendeur;
ResultSet rset = stm.executeQuery(query);
return rset;
}
catch (SQLException ex){
ex.printStackTrace();
return null;
}
} |
Le problème est que les fonctions doivent être synchronisées(…je crois), car elles penvent être appellées par plusieurs clients au même moment. Mais si les toutes les fcts sont “synchronized”, si je ne me trompe pas, une seule d’entre elles peut être appellée à la fois? Donc, le “serveur” devient très inefficace étant donné qu’il traite les appels séquentiellement et non de manière concurrente.
Est-ce que je me trompe? Y a t’il une façon de rendre le serveur plus efficace?
Merci.
[Client/Serveur][Multi-Thread] Serveur/ Fcts synchronisées
D'accord avec toi que les SGBD ont des mécanismes d'exclusion, mais le problème est au niveau de mon "serveur".
CLIENT < -- > SERVEUR < -- > BD
Par exemple, j'ai une fct:
public boolean updateUser( int idUser, String nouveauNom, String nouvelleAdresse, String nouveau noTel ){…}
Si deux clients accèdent à cette fonction au mème moment et que je ne la déclare pas "synchronized"...On ne peut prédire le résultat final dans la BD. Donc, je dois déclarer les fcts du serveurs "synchronized" pour éviter ce genre de problème.
Mais ce qui cause mon problème c'est le fait qu'une seule fct synchronisée peut être appellée sur un même object à la fois. Donc, le “serveur” devient très inefficace étant donné qu’il traite les appels séquentiellement et non de manière concurrente
Voici un exemple, j'ai deux fonctions sur le serveur:
public synchronized void uploaderFichierSurServeur( byte[] fichier ){…}
public synchronized boolean updateUser( int idUser, String nouveauNom ){…}
Je veux que le client 1 puisse uploader un fichier sur le serveur et qu’au même moment le client 2 puisse mettre à jour les infos d’un utilisateur. Deux fcts synchronisées ne peuvent être appellées au même moment(d’après ce que j’ai lu). Donc si un client upload un gros fichier pendant 2 minutes, aucun autre client n’a accès aux autres fcts synchronisées du serveur pendant ce temps. Vrai ou faux ? Est-ce que je me trompe ? Y a-t-il une façon d’éviter ce problème.
Merci.