Bonjour,
J'ai écrit un WebService en C# qui consomme des méthodes d'une classe statique qui permet d'accéder aux données.
Par exemple :
Actuellement, dans ma classe Data, chaque méthode crée, ouvre et ferme une connexion à la base de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public void DoSomething() { Data.DoFirstThing(); Date.DoSecondThing(); }
J'imagine (j'espère) que C# et le pilote SQL Server comprend qu'il ne faut pas ouvrir et fermer "réellement" la base à chaque appel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 public static void NettoyerPartie(int partie_id) { using (SqlConnection cnx = new SqlConnection(CNX_STRING)) { cnx.Open(); using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = "NettoyerPartie"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("partie_id", partie_id); cmd.ExecuteNonQuery(); } cnx.Close(); } } static public Question TrouverMeilleureQuestion(int partie_id) { Question res = new Question(); using (SqlConnection cnx = new SqlConnection(CNX_STRING)) { cnx.Open(); using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = "TrouverMeilleureQuestion"; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("partie_id", partie_id); SqlParameter pid = cmd.Parameters.Add("question_id", SqlDbType.Int, 4); SqlParameter pnom = cmd.Parameters.Add("question_nom", SqlDbType.VarChar, 50); pid.Direction = ParameterDirection.Output; pnom.Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); res.id = (int)pid.Value; res.nom = (string)pnom.Value; } cnx.Close(); } return res; }
Est-ce le cas ?
Du coup, je pose une question :
- Si je rends Data instanciable et que j'ouvre la connexion dans le constructeur et la ferme dans le Dispose(), je réduis le nombre d'ouvertures/fermetures. Cependant, cela veut dire si une méthode de mon WebService met longtemps entre deux appels aux méthodes de data, je conserve inutilement une connexion ouverte, ce qui va augmenter le nombre de connexion concurrentes dans la base ainsi que la charge mémoire. Est-ce que ce sera réellement plus rapide ?
- Enfin, si je n'appelle plus directement SqlConnection mais un singleton qui me retourne une instance partagée de la connexion, vais-je y gagner quelque chose ? Est-ce que je ne risque pas d'avoir des problèmes de contexte entre deux appels au WebService (l'instance de mon singleton sera-t-elle partagée entre tous les appels à mon WebService) ?
Afin d'améliorer les performances, je n'ai pas activé l'état de session sur le serveur.
Une autre solution serait-elle de mettre la connexion en session ? Ou même en variable d'application ? Intérêt, risques ?
Partager