Laisser une connexion ouverte

Résolu
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 30 juil. 2013 à 09:55
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 31 juil. 2013 à 10:21
Bonjour,

J'ai un programme qui peut executer une tonne de requêtes, comme presque pas. Je ne suis pas DBA, et j'aimerais, dans mon programme, faire en sorte que l'application se connecte a la base lorsqu'on la démarre, puis qu'un timeout passe à 60 secondes, et si une requête (n'importe ou dans le programme) utilise la connexion, alors cela relance le timeout à 60 sec.

Y a t-il une astuce pour faire cela ?

Cordialement
--

5 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
30 juil. 2013 à 19:37
Bonsoir,

Ok, j'attendais un peu de code ou une idée sur l'organisation du programme

Sinon, fais un module dans le quel tu stocke la variable de la connexion en public.
Dedans, tu fais une fonction de connexion et une autre de déconnexion.
La première appelée lors du lancement du programme et l'autre lors de la fermeture de l'application.

Ensuite, tu utilise uniquement la variable créée.
1
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 juil. 2013 à 09:48
Salut

-1- Place une variable dteLastUsed de type Date dans la Form. Cette variable te servira a stocker la date et heure de la dernière utilisation de ta DB.
Dans chaque requète que tu soumets, renseigne cette variable en y mettant DateTime.Now

-2- Place un nouveau Timer sur ta Form, Enabled et Interval 1000 ou 2000 (on n'est pas pressé)
Dedans, évalue le temps écoulé depuis ta dernière requète en calculant un TimeSpan et déconnecte toi si ... :
Dim UnUsed As System.TimeSpan = DateTime.Now.Subtract(dteLastUsed)
If UnUsed.TotalSeconds > 60 Then Call maDbDisconnect


-3- Bien sûr, avant chaque requète, il te faudra vérifier si ta connexion est active, auquel cas une reconnexion sera nécessaire
If maConnexion Is Nothing Then Call maDbConnect
1
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
31 juil. 2013 à 09:55
Salut,

Merci beaucoup pour ta solution !
Je pense que nos messages se sont croisés, est ce qu'il y a une solution qui est "mieux" que l'autre ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 juil. 2013 à 10:02
Dans ton code, Moundir76, le Timer commence lors de la connexion.
Le mien commence après la dernière utilisation d'une requète.
A toi de voir laquelle est la plus adaptée à ton besoin ...

Le risque de ta solution est que ta connexion peut se fermer juste avant ou pendant une requète ...
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
Modifié par Moundir76 le 31/07/2013 à 10:49
En effet, je n'avais pas pensé à cette notion de connexion qui peut se refermer pendant un traitement. Théoriquement ce sera impossible car devant chaque requete je fais appel a ma procedure Connect, et cela relance pour trois minutes le compteur.

Voila le code final :

 Sub Connect()
        If MaConnexion.State = ConnectionState.Open Then
        Else
            MaConnexion.Open()
        End If

        'Set interval à 3 minutes
        tmr.Interval = TimeSpan.FromMinutes(3).TotalMilliseconds
        tmr.Start()
    End Sub


Encore merci !
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
30 juil. 2013 à 12:49
Bonjour,

Comment tu fais actuellement ?
As-tu essayer d'utiliser une autre postée pour ta connexion (Module au lieu de fonction par exemple) ?
0
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
30 juil. 2013 à 13:03
Bonjour,

Actuellement, dès que j'ai besoin de ma connexion, je l'ouvre au dernier moment, et je la referme au plus tôt. Cependant, dans mon application, j'ai une fonction de recherche et le temps que la connexion se fasse, cela provoque un léger "freeze" de l'application.

Ainsi je souhaiterais que ma connexion se ferme toute seule si elle n'est plus utilisée au bout d'une minute, car je ne pense pas que ce soit très propre de la laisser ouverte en permanence ?

Ai-je été plus clair ?

Merci d'avance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
31 juil. 2013 à 09:41
Bonjour,

Merci beaucoup, c'est une idée à laquelle je n'avais pas pensée ! Les développeurs VB ont ils souvent recours au module ?

Voici mon code pour ceux que ça pourrais intéresser :

Imports System.Data.SqlClient

Module moduleConnexion
    WithEvents tmr As New Timer
    Dim MaConnexion As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=""Path\de\la BDD\bdd.mdf"";Integrated Security=True;Connect Timeout=30;User Instance=True")
    'Ouvre la connexion et 
    Sub Connect()

        MaConnexion.Open()
        'Set interval à 3 minutes
        tmr.Interval = TimeSpan.FromMinutes(3).TotalMilliseconds
        tmr.Start()
    End Sub

    'Si le timer est a 0 on ferme la connexion
    Private Sub tmr_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tmr.Elapsed
        MaConnexion.Close()
    End Sub


End Module


A+
0
Rejoignez-nous