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

JDBC Java Discussion :

Oracle et problème de fermeture de resultset/statement


Sujet :

JDBC Java

  1. #21
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Perso, je n'ai pas eu le temps d'investiguer là dessus et j'ai contourné le problème.
    Toutes mes fenêtres héritent d'une classe qui ferme la connexion quand je ferme la fenetre.
    Ensuite, j'ai codé un gestionnaire de connexion qui lors du connect ne se reconnecte pas si une connexion est déjà active.
    Donc avant chaque bloc d'instructions utilisant la BDD, je fait un connect qui reste souvent sans effet car déjà connecté.

    Dans ton cas, je te suggère de mettre une connexion dans le header et une déconnexion dans le footer de ta page. Comme ça, tu limites le nombre de curseurs. SI les perfs suivent, ça peut être un bon compromis.

    Bon courage

  2. #22
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adil_vpb Voir le message
    Bref, je ferme mes statements, mais sur la BDD Oracle, et surtout sur OEM -> Instance -> Sessions : le programme "JDBC Thin Client" s'ajoute aux sessions à chaque fois que je rafraichi ma page !
    ...
    Ce ne sont pas les statements qu'il faut fermer, c'est l'objet Connection...
    Tu acquiers une connexion en début de cycle et tu la fermes à la fin du cycle.
    Le pool de connexions permettra (généralement) d'avoir une connexion plus rapidement, mais si tu ne la libères pas, le problème restera le même.

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Je découvre avec une certaine déception ce post (mais avec soulagement également) : j'ai rencontré exactement le même problème sur une application.
    Je ne comprenais pas bien pourquoi les curseurs restaient absolument ouverts alors que je fermais bien les ResultSet et les PreparedStatement ...

    Et il semblerait que vous confirmeriez bien qu'il faut absolument fermer la connexion pour libérer les cuseurs coté Oracle ?? Donc que le close() du ResultSet ne sert à rien ???

    Moi je dis bravo les drivers OJDBC

    Bon, bin je vais aller re-coder la méthode qui gère la connexion pour la fermer à chaque fois, il n'y a plus que ca visiblement

  4. #24
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Baodai Voir le message
    ...

    Bon, bin je vais aller re-coder la méthode qui gère la connexion pour la fermer à chaque fois, il n'y a plus que ca visiblement
    Attention, une connexion/déconnexion est couteuse en temps.
    Il te faut trouver le bon compromis entre nombre de curseurs ouverts et temps passé à se connecter.

    Pour l'utilisation des pools de connexion, je n'ai pas testé mais ça pourrait aider en cas de déconnexion/reconnexion à chaque fois.

  5. #25
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Baodai Voir le message
    Moi je dis bravo les drivers OJDBC
    Ce n'est pas un problème ODBC ou JDBC, c'est un fonctionnement normal.
    La connexion sert de canal vers la DB, le statement est un objet qui permet d'exécuter des requêtes via le canal (Connection).
    Tu peux créer et exécuter plusieurs statements avec la même connexion, ou des PreparedStatement etc...

    Il semble cependant qu'avec Oracle, on puisse avoir un "connection.close()" qui ne libère pas la connexion côté serveur DB
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #26
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Ce n'est pas un problème ODBC ou JDBC, c'est un fonctionnement normal.
    La connexion sert de canal vers la DB, le statement est un objet qui permet d'exécuter des requêtes via le canal (Connection).
    Tu peux créer et exécuter plusieurs statements avec la même connexion, ou des PreparedStatement etc...
    Oui, malheureusement on ne peut pas fermer les curseurs cotés Oracle sans fermer la connexion, alors qu'ils correspondent plutot à l'objet ResultSet.

    Pour le pool de connexion, je ne pourrais à priori pas le mettre en place dans l'application que je traite (script shell qui appelle une classe Java qui effectue un chargement ... indépendament de l'application Web qui utilise bien un pool de connexion).
    Je vais faire des tests en utilisant plusieurs connexions, trouver le bon compromis comme l'a dit lasticot69

  7. #27
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Il n'y a pas besoin de plusieurs connexions, il suffit, en fin de cycle, de fermer LA connexion pour que tout ce qui s'y attache soit fermé (à moins bien sûr d'avoir besoin d'un grand nombre de statement et que ça dépasse le nombre autorisé par la connexion)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #28
    Membre habitué Avatar de adil_vpb
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 326
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par lasticot69 Voir le message
    Perso, je n'ai pas eu le temps d'investiguer là dessus et j'ai contourné le problème.
    Toutes mes fenêtres héritent d'une classe qui ferme la connexion quand je ferme la fenetre.
    Ensuite, j'ai codé un gestionnaire de connexion qui lors du connect ne se reconnecte pas si une connexion est déjà active.
    Donc avant chaque bloc d'instructions utilisant la BDD, je fait un connect qui reste souvent sans effet car déjà connecté.

    Dans ton cas, je te suggère de mettre une connexion dans le header et une déconnexion dans le footer de ta page. Comme ça, tu limites le nombre de curseurs. SI les perfs suivent, ça peut être un bon compromis.

    Bon courage
    Bonjour,
    là j'ai une petite idée et je pense que t'as la cité ci-dessus,
    bon pourquoi pas d'utiliser un connect, comme le cas dans SQL+, je pense que OEM garde le meme programme ouvert (active si on met connect/inactive dans le cas de disconnect, et le kill dans le cas de exit !) j'ai pas encore tésté ce que je dis maintenant, mais peut étre ca ava résoudre le probléme, au lieu de faire une connexion à la BDD à chaque fois, on mets des connect !
    je ne sais pas, je vais tester ça bientôt .
    On est là pour partager notre savoir-faire !

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Je viens de creuser un petit peu l'application que je dois debugger, et les choses se compliquent : elle n'utilise qu'une seule connexion du début à la fin, car une fois tout le traitement effectué, elle effectue un commit en cas de succès, et un rollback si la moindre Exception a été remontée ...

    Il m'est donc impossible de fermer la connexion en cours de route, puisque cela oblige à commiter (ou "rollbacker") avant la fermeture, sauf erreur de ma part ?

    J'ai donc 2 solutions qui me viennent en tête :
    - Trouver une solution pour véritablement fermer ces curseurs sans fermer la connexion
    - Modifier le fonctionnel de l'application pour qu'il traite les données par plus petit paquets, afin que le nombre de curseur ne soit pas trop elevé. Cette 2° solution est évidement bien plus longue à mettre en place, et surtout je ne sais pas si elle est réalisable au niveau du fonctionnel.

    Donc si qq1 me trouve une facon de réaliser la première, j'achète !!!

  10. #30
    Membre habitué Avatar de adil_vpb
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 326
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par Baodai Voir le message
    Donc si qq1 me trouve une facon de réaliser la première, j'achète !!!
    c'est ce qu'on cherche ! mais bon ne t'inquiéte pas ! parce que tu vas acheter la solution, on va la trouver bientôt !

    je vais chercher comme même.

    dis moi Lasticot69 je conais pas ton prénom t'as pas pensé de manipuler la table v$session ?
    On est là pour partager notre savoir-faire !

  11. #31
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Suite à conversation avec gentil DBA, il semblerait possible que fermer le ResultSet ET le PreparedStatement suffise à fermer le cursor coté Oracle ... en tout cas il me signale que l'outil que j'utilise pour surveiller les curseurs ouverts m'indique en réalité les curseurs en mémoire, pas forcément ouverts donc !!!

    Je vais donc essayer de baisser le nombre de curseur max, re-modifier mon code pour avoir une seule connexion tout le long, mais qui ferme les ResultSet et PreparedStatement à chaque fois, et on verra bien si on fait sauter la limite

    Je vous tiens au courant

    Edit : Quand je relis le premier post de Lasticot, je me dis que j'ai assez peu de chance que ca marche, vu qu'il avait déjà fermé le PreparedStatement et le ResultSet ... enfin bon, on ne sait jamais

  12. #32
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bon, j'ai tout modifié comme j'ai dis, j'ai changé le nombre de curseurs ouverts maxi avec la commande ci-dessous, j'ai lancé => pas de problème ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter system set open_cursors = 5;
    Bon, je validerais tout ca demain avec contrôle avisé d'un DBA

  13. #33
    Membre habitué Avatar de adil_vpb
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 326
    Points : 132
    Points
    132
    Par défaut
    Bonjour,
    Est ce que vous pouvez me montrer la chaine de connexion que vous utilisez pour accéder à la BDD Oracle à partir du code java ?
    On est là pour partager notre savoir-faire !

  14. #34
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par adil_vpb Voir le message
    Bonjour,
    Est ce que vous pouvez me montrer la chaine de connexion que vous utilisez pour accéder à la BDD Oracle à partir du code java ?
    Voici celle que j'utilise (cf tout premier post si besoin de plus d'info)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@guzet.**.net:1521:mydb","user","mdp");

  15. #35
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Voici la mienne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jdbc:oracle:thin:@NomOuIPMachine:1521:NomBase
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #36
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par adil_vpb Voir le message
    Bonjour,
    Est ce que vous pouvez me montrer la chaine de connexion que vous utilisez pour accéder à la BDD Oracle à partir du code java ?
    Sinon tu peux aussi faire un semblant de recherche ou aller voir dans la FAQ
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  17. #37
    Membre habitué Avatar de adil_vpb
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 326
    Points : 132
    Points
    132
    Par défaut
    Et moi j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MYHOST)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=MYSERVICE.MYDOMAINE)))","user","mdp");
    j'ai résolu le probléme de session, par la création de deux méthode, une pour ouvrir la connexion dans le Header de la page, et l'autre pour la clôturer dans le footer.
    Aprés j'ai constaté un autre probléme, c'est le nombre de processe !

    j'ai dis que peut être ça dépend de la chaine de connexion, car dans mon cas c'est dispatcher je pense.

    Y a t-il une différence entre les deux chaîne ?
    On est là pour partager notre savoir-faire !

  18. #38
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    La différence de chaine de connexion vient juste du fait que nous avons un fichier TNSNAMES.ORA et un SQLNET.ORA qui servent à éviter des paramétrages du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MYHOST)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=MYSERVICE.MYDOMAINE))
    Ces deux chaines fournissent les mêmes services.

  19. #39
    Membre habitué Avatar de adil_vpb
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 326
    Points : 132
    Points
    132
    Par défaut
    Bon,
    Concernant les chaine de connexion, j'ai posé cette question car dernierement j'ai laissé ma page pendant une large durée, presque une heure, avec une actualisation automatique toute les 20 seconds ! aprés j'ai constaté l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection refused(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=12516)(ERROR_STACK=(ERROR=(CODE=12516)(EMFI=4))))
    je pense que c'est à cause des processes, chaque connexion à la BDD, crée un processe, c'est ce que je pense !
    alors est ce que vous avez rencontré ce type d'erreur ?
    Merci d'avance.
    On est là pour partager notre savoir-faire !

  20. #40
    Membre habitué Avatar de adil_vpb
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 326
    Points : 132
    Points
    132
    Par défaut
    Bonjour,
    Personne n'a jamais vu l'erreur citée dans mon dernier message?
    On est là pour partager notre savoir-faire !

Discussions similaires

  1. JBuilder 2005 et Oracle 9i-> Problème JDBC drive
    Par Devil666 dans le forum JBuilder
    Réponses: 1
    Dernier message: 04/04/2005, 15h14
  2. [TQuery] problème de fermeture
    Par mammistegon dans le forum Bases de données
    Réponses: 5
    Dernier message: 29/01/2005, 19h15
  3. [Thread][socket]Problème de fermeture d'un thread
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 04/11/2004, 02h03
  4. Problème de fermeture de l'application
    Par SkyDev dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 03h06
  5. Problème de fermeture de balise <tr>
    Par nuage dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/03/2004, 10h55

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