persistence.xml pour de multiples unités de persistance
Je suis en train d'essayer de conserver le même entité à la fois MySQL et Postgres bases de données (c'est principalement pour identifier d'éventuelles incohérences, et les détails de tous les problèmes en faisant un double-écrire -- à qui j'ai pu croiser ici). Les articles que j'ai trouvé ont tous décrit les solutions basées sur d'autres cadres. Je suis en train de résoudre ce à l'aide de Glassfish 4.0 out-of-the-box, JPA 2.1 avec EclipseLink 2.5 en tant que fournisseur JPA. Je suis à l'aide d'Eclipse, et de réaliser que l'IDE ne prend pas en charge la configuration de plusieurs unités de persistance dans l'persistence.xml fichier, donc je suis en train d'écrire le fichier XML pour que directement.
Je m'attendais à voir quelque chose comme ceci dans le code (dans la même méthode):
@PersistenceContext(name = "MyAppMySQLPU")
EntityManager emMySQL;
@PersistenceContext(name = "MyAppPostgresPU")
EntityManager emPostgres;
//...etc...
MyThing thing = new MyThing();
//...etc...
emMySQL.persist(thing);
emPostgres.persist(thing);
et l'utilisation d'un persistence.xml
fichier contenant ceci:
<persistence-unit name="MyAppPostgresPU">
<jta-data-source>jdbc/PostgresPool_test</jta-data-source>
<class>model.MyThing</class>
</persistence-unit>
<persistence-unit name="MyAppMySQLPU">
<jta-data-source>jdbc/MySQLPool_test</jta-data-source>
<class>model.MyThing</class>
</persistence-unit>
Quand je fais cela, j'obtiens l'erreur suivante:
SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method
SEVERE: Exception while preparing the app
SEVERE: Exception while preparing the app : Could not resolve a persistence unit corresponding to the persistence-context-ref-name [MyAppPostgresPU] in the scope of the module called [MyApp]. Please verify your application.
Mais, Si je comprend seulement l'un des <persistence-unit>
phrases (n'importe laquelle), l'entité est conservée dans la base de données associée -- je ne peux pas comprendre comment le faire fonctionner avec les deux en même temps (sans en tirant parti de la persistance des fonctionnalités supplémentaires dans les cadres).
OriginalL'auteur CraftWeaver | 2013-08-16
Vous devez vous connecter pour publier un commentaire.
Ai eu de travail; plusieurs choses qui devait être fait. Il semble qu'une grande partie est que pour utiliser les bases de données multiples avec l'approche que je prenais le pool de connexions de type doit être défini pour utiliser les transactions distribuées. Puisque c'est essentiellement une expérience, à la fois db persiste n'a pas besoin à être dans la même opération, mais ce n'est pas un problème pour qu'il puisse en être ainsi. (Cette article a été utile dans l'identification que de messages d'erreur). Il a également été nécessaire de modifier la Postgres paramètres, comme décrit ici, pour permettre les transactions préparées.
Cela a tout va:
(1) Dans Glassfish:
Dans la Connexion JDBC piscines, modifier le type de ressource pour les deux de la db à
javax.sql.XADataSource
. Changement de source de données nom de Classe pour Postgres pourorg.postgresql.xa.PGXADataSource
; changement de source de données nom de Classe pour MySQL àcom.mysql.jdbc.jdbc2.optional.MysqlXADataSource
.(2) Dans Posgres de configuration (
postgresql.config
):Activer
max_prepared_transactions
et le configurer pour qu'il soit 1 de plus quemax_connections
. (J'ai eu à jouer avec les deux paramètres afin de trouver quelque chose qui n'a pas souffler tout disponible de la mémoire partagée; mais puisque ce n'est qu'une expérience, diminution du nombre de db connections vs l'augmentation de la mémoire partagée est OK)(3) Dans le code:
Changement
@PersistenceContext(name="...")
à@PersistenceContext(unitName="...")
Mise en garde sur cette "réponse" -- la Plupart de ce qui est nouveau pour moi, si cela peut ne pas être la façon la plus élégante pour gérer cela. Si quelqu'un peut fournir une "meilleure pratique" pour résoudre ce problème, je serais très intéressé de savoir.
OriginalL'auteur CraftWeaver