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

JOnAS Java Discussion :

[EJB3] Multiple database


Sujet :

JOnAS Java

  1. #1
    Membre régulier
    Inscrit en
    juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut [EJB3] Multiple database
    Bonjour
    Me voici de nouveau bloqué avec mes petits EJB3
    J'ai installé un jonas4.8.6 qui marche bien, j'ai déployé dessus easybeans qui tourne bien aussi pour déployer des EJB3.
    Je bloque actuellement sur le fait d'utiliser 2 bases de données différentes.

    J'ai crée un fichier persistence.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version='1.0' encoding='utf-8'?>  
     
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
         <persistence-unit name="source1_ds">
             <jta-data-source>jdbc/xxxxx/newSource1</jta-data-source>
         </persistence-unit>	
         <persistence-unit name="source2_ds">
             <jta-data-source>jdbc/xxxxx/newSource1</jta-data-source>
         </persistence-unit>     
    </persistence>
    les source1 et source 2 dont définit par 2 rars mis dans le fichier rar/autoload du serveur jonas.
    Ces rar sont utilisés couramment sur d'autre serveur.
    Tant que je n'indique pas la source2, mes EJB marchent bien quand je la rajoute.
    J'obtiens l'erreur suivante :
    Exception in thread "main" javax.ejb.EJBException: java.lang.IllegalArgumentException: Too many persistence-unit defined, cannot take the default one.
    at org.ow2.easybeans.proxy.client.AbsInvocationHandler.handleThrowable(AbsInvocationHandler.java:176)
    at org.ow2.easybeans.proxy.client.ClientRPCInvocationHandler.invoke(ClientRPCInvocationHandler.java:218)
    at org.ow2.easybeans.proxy.client.ClientRPCInvocationHandler.invoke(ClientRPCInvocationHandler.java:111)
    at $Proxy0.createDecalogUser(Unknown Source)
    at com.sits.userManager.test.decalog.TestEjbDecalogUser.main(TestEjbDecalogUser.java:19)
    Caused by: java.lang.IllegalArgumentException: Too many persistence-unit defined, cannot take the default one.
    at org.ow2.easybeans.persistence.PersistenceUnitManager.getPersistenceContext(PersistenceUnitManager.java:104)
    at org.ow2.easybeans.persistence.PersistenceUnitManager.getEntityManager(PersistenceUnitManager.java:124)
    at org.ow2.easybeans.injection.EntityManagerHelper.getEntityManager(EntityManagerHelper.java:70)

    Bon d'après l'erreur j'ai l'impression qu'il faut une JTA par défaut...
    Sauf que j'ai aucune idée de comment faire et je n'ai pas trouvé par google :'(
    D'après mes recherches, j'ai l'impression que mon persistence.xml est correct du coup je comprends pas

    Merci d'avance pour toute piste

  2. #2
    Membre régulier
    Inscrit en
    juillet 2009
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 93
    Points : 90
    Points
    90
    Par défaut
    Bonjour
    en fait j'étais a côte de la plaque
    le problème venait de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	@PersistenceContext(name = CommonConstants.PERSISTANCE_CONTEXT_DECALOG_NAME)
    	private EntityManager em_decalog;
    je définis des unit name dans persistence.xml et j'utilse des names
    ceci marchait tant qu'il n'y avait qu'une source
    la bonne réponse était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	@PersistenceContext(unitName = CommonConstants.PERSISTANCE_CONTEXT_DECALOG_NAME)
    	private EntityManager em_decalog;
    Bonne journée

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    Bonjour,

    je suis interessé par le développement de ta solution...

    car je cherche à faire exactement comme toi. soit me connecter à de multiples database dans une application.

    et je suis intrigué par :

    CommonConstants.PERSISTANCE_CONTEXT_DECALOG_NAME

    qu'est ce que c'est que ca ?

    Merci

  4. #4
    Membre VIP Avatar de kalysto
    Profil pro
    Développeur
    Inscrit en
    mars 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mars 2003
    Messages : 442
    Points : 568
    Points
    568
    Par défaut
    C'est le nom de la persistence-unit duquel provient ton EntityManager.
    En clair, c'est une clé que tu retrouves dans ton fichier persistence.xml.

    Ce fichier peut contenir plusieurs persistece-unit, chacune d'entre elles pouvant etre connectée sur une DataSource (== base de donnée) différente.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    Merci de ta réponse, mais ça c'est la seule partie que j'ai compris ... C'est la suite qui m'est plus vague...

    Ce que je cherche c'est : Comment se connecter à plusieurs database de façon "automatique". En gros, c'est comment mon application peut reconnaitre le domaine qui l'appelle et en fonction de cela, se rediriger vers la bonne base de données ?

    Merci

  6. #6
    Membre VIP Avatar de kalysto
    Profil pro
    Développeur
    Inscrit en
    mars 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mars 2003
    Messages : 442
    Points : 568
    Points
    568
    Par défaut
    Ben ton EntityManager est issu d'une persistence-unit et cette persistence unit elle meme référence 1 et 1 seule DataSource (qui te donne des connexions vers ta base de donnee).

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
                 version="2.0">
      <persistence-unit name="le-nom-que-tu-mets-dans-l-annotation" transaction-type="JTA">
        <jta-data-source>jdbc/MyDataSource1</jta-data-source>
      </persistence-unit>
      <persistence-unit name="le-nom-que-tu-mets-dans-une-autre-annotation" transaction-type="JTA">
        <jta-data-source>jdbc/MyDataSource2</jta-data-source>
      </persistence-unit>
    </persistence>
    Apres, il faut que ces datasources soient configurées dans le serveur:
    http://jonas.ow2.org/JONAS_5_2_0/doc...config.jdbcxml
    ou
    http://jonas.ow2.org/JONAS_5_2_0/doc...html#config.ra
    ou encore
    http://jonas.ow2.org/JONAS_5_2_0/doc...ml#config.jdbc

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    Oups désolé... Mais je me rends comte mtnt que je poste dans JOnAS mais je n'utilise pas ca.. je suis avec GlassFish... Et tes tuto que tu m'as donné ne marches pas.... Désolé... Tu crois que ca marche aussi avec GlassFish?

  8. #8
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : mars 2004
    Messages : 102
    Points : 156
    Points
    156
    Par défaut
    Dans glassfish, je m'en suis tiré un créant un .jar dans lequel il n'y a qu'un fichier persistence.xml :
    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
     
    <persistence version="2.0"
        xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
        <persistence-unit name="jpa-1">
            <jta-data-source>jdbc/derby-1</jta-data-source>
            <jar-file>jpa2-test-1.jar</jar-file>
            <properties>
                <property name="eclipselink.logging.level" value="FINE" />
            </properties>
        </persistence-unit>
        <persistence-unit name="jpa2-2">
            <jta-data-source>jdbc/oracle-report1</jta-data-source>
            <jar-file>jpa2-oracle-1.jar</jar-file>
        </persistence-unit>
    </persistence>
    et dans les ejbs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @PersistenceContext(unitName = "jpa2-2")
    protected EntityManager em;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    @PersistenceContext(unitName = "jpa-1")
    protected EntityManager em;

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    OK je crois que je me suis mal exprimé.. Ca j'ai bien compris...

    Je vais essayer d'imager mon problème...

    J'ai 2 domaines : www.mondomaine.com et www.mon2emedomaine.com

    Chacun d'eux se connecte sur la même appli "plugin". Et chacun d'eux possède ca propre DB : ma1ereDB et ma2emeDB.

    Lorsque www.mondomaine.com envoie une requète à "plugin", "plugin" doit reconnaitre dans le service REST que c'est www.mondomaine.com qui fait appelle à lui (deja ca je ne sais pas comment faire : trouver l'url qui appelle le service REST). Ensuite, le service REST transmet l'information à la couche manager de la classe concernée (Manager est la 2ème couche). Manager fait les traitements nécessaires puis transmet la requête final au DAO (DAO est la 3ème couche). Le DAO se connecte à la BDD grâce au @PersistenceContext et retourne l'objet final jusqu'au service REST.

    Mon problème est : Comment faire pour que mon DAO sache que c'est www.mondomaine.com qui, a la base, a fait appelle à lui et que, en fonction de cela, il doive appeler tel EntityManager ?

    car je vois bien que dans ta solution, tu me propose de créer 2 EntityManager différents en fonction de la base que je dois utilisé, mais ca m'explique pas comment faire appelle à eux "automatiquement" en fonction du domaine qui demande la requête...

    J'espère que j'ai été plus claire.... Et que quelqu'un trouvera une solution à mon problème, car la je suis VRAIMENT perdu..

    D'avance merci

  10. #10
    Membre VIP Avatar de kalysto
    Profil pro
    Développeur
    Inscrit en
    mars 2003
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : mars 2003
    Messages : 442
    Points : 568
    Points
    568
    Par défaut
    Ah oui, la c'est beaucoup plus clair

    Pour moi, je vois 2 solutions:
    1. Avoir 2 applications différentes (configurées pour pointer sur 2 DS différentes). C'est la solution la plus scalable car si tu as d'autres domaines à gérer, il te suffit de rajouter une application.
    2. Harcoder ton application pour avoir les 2 EntityManager à disposition et, suivant l'URL d'appel orienter vers le 1er EM ou le 2nd. C'est moins scalable et propre car ton application est hardcodée. Que se passe-t-il quand tu voudras rajouter un domaine ? Et puis ca complexifie ton application.

    Néanmoins:
    Pour acceder aux infos de requete:
    http://download.oracle.com/javaee/6/...e/UriInfo.html
    Injecté avec
    http://download.oracle.com/javaee/6/...e/Context.html
    doc:
    http://jersey.java.net/nonav/documen...rs.html#d4e510

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    juin 2010
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2010
    Messages : 138
    Points : 55
    Points
    55
    Par défaut
    OK merci je vais tester ca et te dire si ca marche.

    Je voulais faire une appli par domaine, mais le prix de l'hébergement Java me fait rendre compte que c'est IMPOSSIBLE de faire ça et de demander ce prix à mes clients.

    Donc je dois me rabattre sur le seconde solution et Hardcoder chaque nouveau domaine...

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

Discussions similaires

  1. [MySQL-5.5] Multiple database ou multiserver
    Par sinquem dans le forum Installation
    Réponses: 0
    Dernier message: 25/10/2014, 10h30
  2. Configuration Hibernate Multiple Database
    Par shouwy dans le forum Hibernate
    Réponses: 4
    Dernier message: 24/01/2014, 10h13
  3. SP2010 - Problème de multiple Database SQL server 2008
    Par zencorp dans le forum Installation
    Réponses: 0
    Dernier message: 19/01/2011, 16h46
  4. Spring et multiples databases dynamiques
    Par R1D3M4N dans le forum JPA
    Réponses: 4
    Dernier message: 15/12/2008, 13h33
  5. Problème de select multiple + database
    Par thomfort dans le forum Langage
    Réponses: 3
    Dernier message: 31/01/2008, 23h50

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