2013-08-16 60 views
11

Aynı varlığı hem MySQL hem de Postgres veritabanlarına dayandırmaya çalışıyorum (bu, öncelikle tutarsızlıkları tanımlamak ve çift yazmayı yapan herhangi bir sorunun ayrıntılarını çalışmaktır. Buraya girdim. Bulduğum makaleler, ek çerçevelere dayanan tüm çözümleri açıkladı. Bunu, GlassAndroid 4.0'ı kullanıma hazır bir kutuda, JPA 2.1'i JPA sağlayıcısı olarak EclipseLink 2.5 ile çözmeye çalışıyorum. Eclipse kullanıyorum ve IDE'nin persistence.xml dosyasında birden çok kalıcılık birimini yapılandırmayı desteklemediğini fark ettim, bu yüzden bunun için doğrudan XML yazdım.persistence.xml

I (aynı yöntemle) kodunda böyle bir şey yapmak için bekliyordum: Bu içeren bir persistence.xml dosyayı

@PersistenceContext(name = "MyAppMySQLPU") 
EntityManager emMySQL; 
@PersistenceContext(name = "MyAppPostgresPU") 
EntityManager emPostgres; 
//...etc... 
MyThing thing = new MyThing(); 
//...etc... 
emMySQL.persist(thing); 
emPostgres.persist(thing); 

ve kullanımı:

<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> 

Bunu, ben Bensadece bir eklerseniz,

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. 

Ama: aşağıdaki hatayı alıyorum 10 ifade (hangisi önemli değil), varlık ilişkili veritabanına kalıcı - Ben aynı anda hem de aynı anda çalışmak için nasıl elde edeceğini anlayamıyorum (ek çerçevelerde kalıcılığı işlevselliği kullanmadan).

cevap

15

Çalışıyor; birkaç şey yapılması gerekiyordu. Bunun önemli bir parçası, benim kullandığım yaklaşımla çoklu veritabanlarını kullanabilmek için, bağlantı havuzu türünün dağıtılmış işlemleri kullanmak üzere ayarlanması gerektiğidir. Bu aslında bir deney olduğundan, her iki db de aynı işlem için 'un olmasını istemedi, ancak bu şekilde olması sorun değil. (This makalesi, hata iletilerinden tanımlanmasında yardımcı oldu). Hazırlanan işlemleri etkinleştirmek için Postgres parametrelerini here açıklandığı gibi değiştirmek de gerekliydi.

(1) GlassFish In: JDBC Bağlantı havuzlarda
, javax.sql.XADataSource hem db için kaynak türünü değiştirmek


Bu

tüm götürüyorsun. Postgres için Veri Kaynağı Sınıf Adını org.postgresql.xa.PGXADataSource olarak değiştirin; MySQL için Datasource Sınıf Adını com.mysql.jdbc.jdbc2.optional.MysqlXADataSource olarak değiştirin.

(2) Posgres konfigürasyonu (postgresql.config) 'de:
max_prepared_transactions etkinleştirme ve max_connections 1'den büyük olacak şekilde ayarlamak. (Kullanılabilir tüm paylaşımlı belleği dışarı alamayan bir şey bulmak için her iki parametreyle oynamak zorundaydım, ancak bu yalnızca bir deney olduğundan, paylaşılan belleğin artmasına karşı db bağlantılarının sayısının azaltılması tamam demektir)

(3) kodunda:
Değişim bu "yanıt" ile ilgili @PersistenceContext(name="...")


@PersistenceContext(unitName="...") için Uyarı - Bunun büyük kısmı benim için yeni, yani bu bu işlemek için en zarif yolu olmayabilir. Bunu çözmek için "en iyi uygulama" sağlayabiliyorsa, bilmek isterim.