IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

Fermeture des curseurs


Sujet :

Développement Web en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut Fermeture des curseurs
    Bonjour,

    Dans mon application web, lorsque l'utilisateur est enregistré et clique ensuite sur déconnexion, la connexion à la DB(oracle) est fermée et la session est invalidée.
    On se retrouve donc avec 0 curseur ouvert dans la DB pour cet utilisateur.

    Cependant, si celui-ci, plutôt que de se déconnecter proprement, clique sur la croix de la fenêtre (explorateur web), les curseurs restent ouverts.

    Y-a-t-il une solution pour contrer se problème ? détecter que l'utilisateur n'est plus connecté?

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 80
    Par défaut client serveur
    Bonjour,

    Le retour du client / serveur ... Une bonne architecture serait de mutualiser la connexion Oracle, mais ce n'est sans doute pas possible (licence, authentification ...).
    • Une solution serait de récupérer l'événement de fermeture de Windows et se brancher sur le code de fermeture (je fais souvent cela avec des applis VBA).
    • Une autre solution c'est de rendre la croix inactive et donc de forcer l'utilisateur à utiliser votre bouton de fermeture.


    Dans les applis vba j'utilise le code suivant pour bloquer l'usage de la croix, il faudrait trouvé le moyen de l'appliquer à une fenêtre navigateur, il faut aussi trouver le moyen de faire tourner ce code côté client, mais comme c'est du client / serveur pas difficile de faire un déploiement:

    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
     
    Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, _
    ByVal wFlags As Long) As Long
    Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
    Private Const MF_BYPOSITION = &H400&
     
    Les déclarations sur l'API windows
    et son utilisation:
    Private Sub UserForm_Initialize()
        Dim lHwnd As Long
        lHwnd = FindWindow("ThunderDFrame", Me.Caption) 'Change to match your userforms caption
        Do While lHwnd = 0
            lHwnd = FindWindow("ThunderDFrame", Me.Caption) 'Change to match your userforms caption
            DoEvents
        Loop
        RemoveMenu GetSystemMenu(lHwnd, 0), 6, MF_BYPOSITION 'When using by position, 6 represents the 7th menu item (including separators)
    End Sub
    Salutations

  3. #3
    Membre éprouvé Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Par défaut salut
    Citation Envoyé par libuma Voir le message
    Cependant, si celui-ci, plutôt que de se déconnecter proprement, clique sur la croix de la fenêtre (explorateur web), les curseurs restent ouverts.

    Y-a-t-il une solution pour contrer se problème ? détecter que l'utilisateur n'est plus connecté?
    Merci d'avance.
    En travaillant avec des cookies (Encore faudrait il que le client les accepte) dont tu en contrôle l'existence tu peux détecter une fermeture intempestive du navigateur client. Sinon il faut faire des règles organisationnelles pour l'utilisation de ton application (Forcer les utilisateurs à avoir les bonnes habitudes ou les pénaliser coté serveur).

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Je ne suis pas certain d'avoir tout compris, en tout cas, il ne faut pas laisser de connexions ouvertes comme cela en espérant que ton utilisateur va les fermer.
    Les connexions doivent être fermées après utilisation et réouvertes pour une nouvelle demande. Tu peux passer par un pool de connexions pour une meilleure gestion.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Je ne suis pas certain d'avoir tout compris, en tout cas, il ne faut pas laisser de connexions ouvertes comme cela en espérant que ton utilisateur va les fermer.
    Les connexions doivent être fermées après utilisation et réouvertes pour une nouvelle demande. Tu peux passer par un pool de connexions pour une meilleure gestion.
    C'est justement le but...
    Trouver le moyen de fermer toutes les connexions.

    @Spopoff: Malheureusement, il m'est impossible via Java de modifier le comportement de la fermeture d'une fenêtre IE.

    @juridakus: ça me parait une bonne piste, je vais déjà voir si c'est pratiquable dans notre environnement. Mais cela veut dire exécuter des scripts de contrôle tous les X temps ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    A chaque demande d'infos qui arrive sur ton serveur, tu fais tes traitements, tu prépares la réponse et tu fermes tes connexions.
    Ce n'est pas comme cela que tu procèdes, non ?

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Par défaut
    Si au bout d'un certain temps, aucune requête n'est faite par l'utilisateur tu peux fermer les connexions. Tu peux pas le gérer côté Oracle ? Sinon en Java mais bon...

  8. #8
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Citation Envoyé par fr1man Voir le message
    A chaque demande d'infos qui arrive sur ton serveur, tu fais tes traitements, tu prépares la réponse et tu fermes tes connexions.
    Ce n'est pas comme cela que tu procèdes, non ?
    Si.
    Je procède comme ceci :
    Appel de la procédure dans une méthode.
    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
     
     
    ArrayList rights= new ArrayList();
    OracleCallableStatement cstmt = (OracleCallableStatement)cn.prepareCall ("{call OWNER.PACKAGE.PROCNAME (?)}");					
    // Declare that the outparam cursor
    cstmt.registerOutParameter (1, OracleTypes.CURSOR);
    // Do the call
    cstmt.execute ();
    // Get the RS
    ResultSet rs = (ResultSet)cstmt.getObject(1); 
    // Trought the RS : 
    while(rs.next())
    {	
        rights.add(rs.getString("MY_FIELD"));
    }
    rs.close();
    rs=null;
    cstmt.close();
    cstmt = null; 
     
    return rights;
    Ensuite lorsque j'interroge la vue v$open_cursor, j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select sql_text from v$open_cursor where user_name = 'MY_CURRENT_USER';
    -> BEGIN OWNER.PACKAGE.PROCNAME (:1); END;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. temps de traitement des curseurs
    Par charluber dans le forum Oracle
    Réponses: 1
    Dernier message: 20/04/2006, 10h46
  2. Ouverture et fermeture des tables
    Par Christophe Charron dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/03/2006, 10h14
  3. [Hibernate][Struts] Fermeture des session hibernate
    Par osopardo dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/08/2005, 17h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo