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

Servlets/JSP Java Discussion :

Plus de données à lire dans le socket


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 10
    Points
    10
    Par défaut Plus de données à lire dans le socket
    Tout d'abord bonjour à tous et merci d'avance à ceux qui prendront le temps de me répondre,
    Je viens vers vous car après multiples recherches je ne trouve pas solution à mon soucis et peut être que parmis vous une personne a déja été confronté à ce soucis..
    En deux (trois) mots J'ai développé sous la base du design pattern DAO une appli qui attaque une BDD et qui me fabrique un gros xml.
    Cette appli fonctionne tant que je la sollicite régulièrement et tous les matins j'ai le message plus de données à lire dans le socket.
    J'utilise un design pattern Singleton pour ma connection dans une classe déclaré dans le fichier de déploiement comme listener.
    Exemple Source de la servlet listener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Override
        public void contextInitialized(ServletContextEvent sce) {
            // Instancier notre SingletonConnector BDD et mise dans le context
            Connection connection = SingletonConnector.getInstance();    
        sce.getServletContext().setAttribute(ConstantesApplication.SINGLETON_CONNECT, connection);
        }
    Je vous passe le code du singleton il me renvoie une instance de connection si elle existe pas sinon il me renvoie celle qui existe.

    Mes pistes et questions sont les suivantes :
    Quelle est le cycle d'une instance de connection mis en mémoire lors du déploiement d'une application JAVAEE par le biais de ma servlet listener ?
    Est-ce que le singleton est détruit par le garbage collector ou est-ce oracle qui considère que ce n'est plus utilisé et qui me kill cette connection entre lui et java ? bref j'ai un soucis de persistence de mon connector à mon avis ? car les statements je les rénitialise à chaque instance de traitement et les results idems et je close toujours bien à la fin les statements et les results ? donc je suis paumé.
    Je vous remercie par avance du temps que vous voudrez bien consacrez à ce message.
    Cordialement,
    Hervé

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 10
    Points
    10
    Par défaut reponse
    Re à tous,
    Je reviens vers vous car j'ai trouvé comment réglé mon soucis et comme toute bonne pratique je viens poster ma solution.
    En fait le serveur oracle sur lequel je prends mes données est arrêté toutes les nuits et relancé chose que je ne savais pas.
    donc on objet de connection (cursor) est toujours valide mais il pointe vers plus rien de valide.
    donc j'ai modifié mon singleton de connection je vous donne une soluce.
    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
    public class SingletonConnector {
     
        private static Connection connector = null;
        private static Logger log = Logger.getLogger(SingletonConnector.class);
     
        private SingletonConnector() {
        }
     
        public static Connection getInstance() {
     
            try {
                if (connector != null && !connector.isValid(5)) {
                    connector.close();
                }
            } catch (SQLException e1) {
                log.warn("ERREUR close Singleton : " + e1.getMessage());
            } finally {
                connector = null;
            }
     
            if (connector == null) {
                try {
                    Class.forName(ConstantesApplication.CLASS_FOR_NAME);
                    connector = DriverManager.getConnection(
                            ConstantesApplication.URL_USER_PROTOCOL,
                            ConstantesApplication.USER,
                            ConstantesApplication.PASSWORD);
                } catch (SQLException ex) {
                    System.out.println("Impossible d'ouvrir une nouvelle connexion\n" + ex.getMessage());
                } catch (NullPointerException e) {
                    System.out.println("Impossible d'ouvrir une nouvelle connexion\n" + e.getMessage());
                } catch (ClassNotFoundException e) {
                    System.out.println("Impossible de retrouver la classe\n" + e.getMessage());
                }
            }
            return connector;
        }
    }
    J'ai rajouté le test de validation. ne fonctionnant que sur JAVA 1.6 par contre. sinon il faudrait poser une requete de base genre select * from dual et tester le retour pour voir si ca fonctionne dans les version java inférieures.
    et dans la class qui utilise voila mon test sachant que je mets mon objet de connection dans la portée application (context) voila le test a rajouté ainsi vous saurez si votre singleton de connection est toujours opérationnel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
                    Connection cnx = (Connection) this.getServletContext().getAttribute(ConstantesApplication.SINGLETON_CONNECT);
                    if (!cnx.isValid(5)) {
                        cnx = SingletonConnector.getInstance();
                        this.getServletContext().setAttribute(ConstantesApplication.SINGLETON_CONNECT, cnx);
                    }
                    this.daolheoindex = new DaoLheoIndex(cnx);
                    this.serviceslheoindex = new ServicesLheoIndex(this.daolheoindex);
    etc... fin traitement du try et catch

    Cordialement,
    Je mets en résolu

    Hervé

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Dans l'ensemble, il est plutôt recommandé d'utiliser un pool de connexions configuré au niveau du serveur d'application java. Et d'utiliser ce pool de connexions dans la définition d'une datasource. Datasource utilisée dans l'appli pour obtenir des connexions dont on est sur d'être valide.

    De plus ta méthode est extrêmement limitante dans le sens où elle te permet une et une seule connexion en parallèle, ce qui risque de finir par devenir un goulet d'étranglement pour ton application. Alors qu'un pool de connexions te permettra d'en avoir un bon nombre à disposition.

    De plus le mécanisme de datasource te permet de déporter la configuration de ta base de données à l'extérieur de ton application, et donc de ne pas avoir à refaire un livrable pour chaque environnement ou à chaque changement de serveur.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 10
    Points
    10
    Par défaut Merci de cette piste
    Bonjour à tous et merci à sinok pour sa réponse,

    Tout d'abord merci pour avoir mis la balise autour de mon code désolé de l'oubli
    Pour ce qui est du pool de connexion j'avoue ne pas maitriser ce sujet je suis actuellement en stage et analyse l'ensemble du projet sur lequel je travaille en grande autonomie.

    J'ai fais le choix glassfish, je l'ai installé avec un développeur java sur place sur un serveur de test sans grande maitrise hélas d’où l'intérêt du serveur de tests...
    J'ai en effet vu qu'il y avait un paramétrage des pool de connexion je n'en ai jamais paramétré je vais me pencher sur la question si tu as des pistes d'exemples assez simples sur le sujet je suis preneur cela va de soi que je vais chercher pas moi même (pour rappel JAVAEE/ORACLE).

    Encore merci de ta réponse et ton professionnalisme malgré le sujet notifié comme résolu.

    Hervé

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour configurer le pool de connexion et la datasource, il suffit de suivre les exemples fournis dans la documentation de Glassfish: http://download.oracle.com/docs/cd/E...html#scrolltoc

    Pour utiliser une datasource, bah suffit d'aller voir les exemples dans la FAQ
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

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

Discussions similaires

  1. Plus de données à lire dans le socket
    Par le tonbre 2011 dans le forum Oracle
    Réponses: 1
    Dernier message: 24/08/2011, 14h50
  2. il n'y a plus de données à lire dans le socket
    Par nawal59 dans le forum Designer
    Réponses: 1
    Dernier message: 05/10/2010, 18h04
  3. Réponses: 2
    Dernier message: 26/09/2006, 19h42
  4. Réponses: 18
    Dernier message: 09/08/2005, 12h57
  5. Réponses: 23
    Dernier message: 22/04/2004, 11h55

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