persistence.xml für mehrere persistenzeinheiten
Ich versuche beibehalten der gleichen Person zu MySQL-und Postgres-Datenbanken (dies ist in Erster Linie der Identifikation von Inkonsistenzen, und arbeiten Sie heraus, die details der Probleme dabei die dual-schreiben-was, wie ich ausgeführt habe in hier). Die Artikel, die ich gefunden habe, haben alle beschriebenen Lösungen an, abhängig von weiteren Rahmenbedingungen. Ich versuche, dies zu lösen, mit Glassfish 4.0 out-of-the-box, JPA 2.1 mit EclipseLink 2.5 als JPA-provider. Ich bin mit Eclipse und erkennen, dass die IDE nicht unterstützt Konfiguration mehrerer Ausdauer Einheiten in der persistence.xml Datei, so Schreibe ich die XML denn das direkt.
Ich hatte erwartet, etwas zu tun, wie dies im code (in der gleichen Methode):
@PersistenceContext(name = "MyAppMySQLPU")
EntityManager emMySQL;
@PersistenceContext(name = "MyAppPostgresPU")
EntityManager emPostgres;
//...etc...
MyThing thing = new MyThing();
//...etc...
emMySQL.persist(thing);
emPostgres.persist(thing);
verwenden und eine persistence.xml
Datei mit dieser:
<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>
Wenn ich dies mache, bekomme ich die folgende Fehlermeldung:
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.
Aber, Wenn ich nur eines der <persistence-unit>
Sätze (egal welche), die Entität persistiert der damit verbundenen Datenbank-ich habe nur nicht herausfinden können, wie man es für die Arbeit mit beiden zur gleichen Zeit (ohne Nutzung von Persistenz-Funktionalität in weitere frameworks).
InformationsquelleAutor CraftWeaver | 2013-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe es funktioniert; mehrere Dinge, die getan werden musste. Es scheint ein wichtiger Teil dieses ist, dass, um zu verwenden, die mehrere Datenbanken mit dem Ansatz, den ich nehmen musste, der Verbindungs-pool-Typ muss gesetzt werden, um verteilte Transaktionen verwenden. Da dies ist im wesentlichen ein experiment, sowohl die db weiterhin nicht müssen in der gleichen Transaktion, aber es ist nicht ein problem für Sie, so zu sein. (Diese Artikel war hilfreich bei der Identifizierung, dass aus den Fehlermeldungen). Es war auch notwendig, um die Postgres-Parameter wie beschrieben hier, zu ermöglichen, vorbereitete Transaktionen.
Dieser hat alles geht:
(1) In Glassfish:
In der JDBC-Connection-pools, ändern Sie den Ressourcentyp für beide db ' s zu
javax.sql.XADataSource
. Ändern Datasource-Klassennamen für Postgres zuorg.postgresql.xa.PGXADataSource
; ändern Datasource-Klassennamen für MySQL zucom.mysql.jdbc.jdbc2.optional.MysqlXADataSource
.(2) In der Posgres-Konfiguration (
postgresql.config
):Aktivieren
max_prepared_transactions
und legen Sie es um 1 größer alsmax_connections
. (Ich hatte zu spielen, um mit beiden Parametern zu finden, etwas nicht zu sprengen alle verfügbaren shared-memory, aber da dies ist nur ein experiment, eine Verringerung der Anzahl der db-verbindungen vs zunehmenden shared-memory ist OK)(3) In den code:
Ändern
@PersistenceContext(name="...")
zu@PersistenceContext(unitName="...")
Einschränkung auf diese "Antwort" -- das Meiste ist neu für mich, so kann dies nicht die eleganteste Art das zu handhaben. Wenn jemand eine "best practice" um dieses Problem zu lösen, wäre ich sehr daran interessiert zu wissen.
InformationsquelleAutor CraftWeaver