OVH Cloud OVH Cloud

Service...

7 réponses
Avatar
MrChris
Salut !

J'ai le problème suivant :
J'ai programmé un service qui écoute sur un port les demandes des clients
et va chercher dans une base Sql les informations demandées.

Au démarrage de ce service, je me connecte à la base (tout ce qu'il y a de
plus classique).

Mais au bout de 2 ou trois jours, le service fonctionne toujours sauf qu'il
n'effectue plus les opérations sur la base.

Je me demandais si il etait possible qu'au bout d'un certain temps la
connection à la base
soit coupé et comment faire pour que mon service soit toujours en mesure de
consulter
la base ??? (j'aimerais éviter d'ouvrir et fermer la connection à chaque
demande ou de
faire un batch qui redémarre mon service toute les nuits.)

Merci pour vos lumières...
MrChris

7 réponses

Avatar
Sébastien Curutchet
Tu peux fermer et ouvrir des connexions à chaque fois.
Normalement .NET gère un pool de connexions ainsi que SQLServer : si tu
réouvres une connexion qui a été utilisée peu de temps avant, il reprend la
même ; physiquement la connexion n'est pas fermée.


"MrChris" a écrit dans le message de news:

Salut !

J'ai le problème suivant :
J'ai programmé un service qui écoute sur un port les demandes des clients
et va chercher dans une base Sql les informations demandées.

Au démarrage de ce service, je me connecte à la base (tout ce qu'il y a de
plus classique).

Mais au bout de 2 ou trois jours, le service fonctionne toujours sauf
qu'il
n'effectue plus les opérations sur la base.

Je me demandais si il etait possible qu'au bout d'un certain temps la
connection à la base
soit coupé et comment faire pour que mon service soit toujours en mesure
de consulter
la base ??? (j'aimerais éviter d'ouvrir et fermer la connection à chaque
demande ou de
faire un batch qui redémarre mon service toute les nuits.)

Merci pour vos lumières...
MrChris



Avatar
MrChris
Dans ce cas c'est cool !
Mais j'ai peur des performances, chaque clique sur un des bouton
du client remplis une listview d'une centaines d'éléments qu'il va chercher
dans la base, et fois quarante utilisateurs...
Je ne sais pas trop comment faire pour optimiser la chose.
J'ai pensé à un dataset en mémoire pour le service et faire
des transactions avec la base, mais comme il y a beaucoup de mise
à jour, je me vois mal faire des mises à jours toutes les 5 minutes...
Surtout si ca plante avant la mise à jour, je perd les dernières 5
minutes...

C'est un casse tête...
Mais je vais changer le code pour ouvrir et fermer la connection à chaque
fois.
J'ai en moyenne une dizaine d'accès à la base par minute dans la journée, ce
qui
maintient la connection, mais la nuit plus rien !

Merci pour ta réponse !
MrChris
Avatar
Quentin Pouplard
MrChris wrote:
C'est un casse tête...
Mais je vais changer le code pour ouvrir et fermer la connection à
chaque fois.



C'est même conseillé de fonctionner comme cela en .NET... avec ADO.NET
on est passé dans un mode disconnected. (ce qui explique la présence
d'un pool de connex et le fonctionnement des dataset). Dans l'ensemble
c'est plutôt une bonne nouvelle ;)

--
Quentin Pouplard
http://www.sf.net/projects/myoe
Avatar
Patrice
Justement l'objectif du pool est de réduire les temps de
création/destruction des connexions...

Esaie une simple simulation de charge et vois le temps que tu passes à créer
des connexions. Tu verras qu'il est tout à fait minime (compare
éventuellement avec ce que cela donne lorsque le pool n'est pas activé).


Patrice
--

"MrChris" a écrit dans le message de
news:
Dans ce cas c'est cool !
Mais j'ai peur des performances, chaque clique sur un des bouton
du client remplis une listview d'une centaines d'éléments qu'il va


chercher
dans la base, et fois quarante utilisateurs...
Je ne sais pas trop comment faire pour optimiser la chose.
J'ai pensé à un dataset en mémoire pour le service et faire
des transactions avec la base, mais comme il y a beaucoup de mise
à jour, je me vois mal faire des mises à jours toutes les 5 minutes...
Surtout si ca plante avant la mise à jour, je perd les dernières 5
minutes...

C'est un casse tête...
Mais je vais changer le code pour ouvrir et fermer la connection à chaque
fois.
J'ai en moyenne une dizaine d'accès à la base par minute dans la journée,


ce
qui
maintient la connection, mais la nuit plus rien !

Merci pour ta réponse !
MrChris




Avatar
Bonjour,

l'utilisation d'un dataset peut pénaliser les temps de réponse aussi un
dataset se charge en mémoire et stocke toute les modification qui sont
faites dessus pour ensuite mettre à jour la base. Si votre service n'a pas
pour objectif de faire une mise à jour de la base alors il vaut mieu
utiliser des dataview par exemple ou des datareader qui iront beaucoup plus
vite qu'un dataset.

Sebastien
"MrChris" a écrit dans le message de
news:
Dans ce cas c'est cool !
Mais j'ai peur des performances, chaque clique sur un des bouton
du client remplis une listview d'une centaines d'éléments qu'il va


chercher
dans la base, et fois quarante utilisateurs...
Je ne sais pas trop comment faire pour optimiser la chose.
J'ai pensé à un dataset en mémoire pour le service et faire
des transactions avec la base, mais comme il y a beaucoup de mise
à jour, je me vois mal faire des mises à jours toutes les 5 minutes...
Surtout si ca plante avant la mise à jour, je perd les dernières 5
minutes...

C'est un casse tête...
Mais je vais changer le code pour ouvrir et fermer la connection à chaque
fois.
J'ai en moyenne une dizaine d'accès à la base par minute dans la journée,


ce
qui
maintient la connection, mais la nuit plus rien !

Merci pour ta réponse !
MrChris




Avatar
MrChris
Comme dit précédamment, j'ai une dizaine de mise à jour par minutes...

Mais ce qui m'inquiète avec le dataset, c'est dans le cas de transaction
avec la base, si le service
plante, je perd les modifs.

Je peux faire un commit de la transaction toutes les 5 minutes, mais dans ce
cas je retombe
sur mon problème d'un grand nombre d'accès à la base par unité de temps.

Mais je me tourne vers Procédure stocké et ouverture d'une connection à
chaque
demande, je vais faire confiance au pool de connection comme suggéré dans
les
posts précédents

Merci pour ta réponse !
MrChris
Avatar
de rien pour la réponse elle a pas du aider beaucoup ;)

cela dit tu sais qu'au niveau des sqldataadapter tu peux gérer des
transactions donc place le update dans une transaction est en cas de
plantage envoi le dataset dans un fichier sur le disque dur tu pourra le
recharger et le réinjecter ensuite sans problème un peu comme le journal sql
server par contre pense a ne pas faire de dataset.acceptchanges() temps
qu'il a pas été repassé c'est une idée si elle peut t'aider à gérer les
plantages ;)

De toute façon si tu utilise un provider spécialement développé pour ta base
(comme sqldataadapter par ex pour sql server) il est sensé être complétement
optimisé il n'y aura pas grand chose à gratter je pense .

Sebastien
"MrChris" a écrit dans le message de
news:
Comme dit précédamment, j'ai une dizaine de mise à jour par minutes...

Mais ce qui m'inquiète avec le dataset, c'est dans le cas de transaction
avec la base, si le service
plante, je perd les modifs.

Je peux faire un commit de la transaction toutes les 5 minutes, mais dans


ce
cas je retombe
sur mon problème d'un grand nombre d'accès à la base par unité de temps.

Mais je me tourne vers Procédure stocké et ouverture d'une connection à
chaque
demande, je vais faire confiance au pool de connection comme suggéré dans
les
posts précédents

Merci pour ta réponse !
MrChris