2010-06-08 21 views
5

JPA'dan yararlanan bir Java web uygulamasına sahibim. Veritabanı örneği, jta-data-source etiketini kullanarak persistence.xml dosyasında belirtilmiştir.persistence.xml dosyasında JPA veritabanı örneği nasıl parametrelenir?

Web uygulamasının ikinci bir kopyasını aynı (glassfish) sunucuya dağıtmak, ancak farklı bir veritabanı örneğine yönlendirmek istiyorum.

Bunu başarmanın en iyi yolu nedir? İdeal olarak, savaşın dışına bir persistence.xml geçersiz kılma dosyası yerleştirmek istiyorum (sınıf yolunda bir yerde?). Tam olarak nereye koyacağımı ya da diğer örneğimle örtüşmeyecek şekilde nasıl tanımlayacağımı tam olarak bilmiyorum. Bu şekilde bir avuç örneği barındıracağımızı görebiliyorum (SaaS) ve konfigürasyonun dağıtılmış savaşın dışında kalmasını istiyorum, böylece bakım sorunu olmayacaktı. İstemciler arasında bir veritabanı örneğini paylaşma güvenlik nedenleriyle bir seçenek değildir.

Bu grubumuz için benzersiz bir sorun olmadığından eminim. Başkalarının bu sorunu çözmek için kullandıkları en iyi uygulamalar nelerdir?

+0

Uygulamanın çalıştığı birden fazla benzersiz örneğiniz varsa, neden 2. örnek için persistence.xml dosyasını değiştirmeyelim? – kgrad

+0

Her derlemede bunu manuel olarak yapmak zorunda olduğum bir bakım problemi gibi görünüyor, otomatik bir çözüm istiyorum. – Vinnie

cevap

1

arasında jta-data-source elemanı belirli bir veri kaynağı ilan edeceğini i sanırım kopyayı başka şeylerde de değiştiriyorsun? (ör. kulak dosyasının adı)

Ant veya maven gibi bir derleme yazılımı kullanıyorsanız, persistence.xml içinde yer tutucu kullanabilir ve farklı yapı parametrelerini kullanarak farklı bir "kopya" oluşturabilirsiniz.

örn. maven ile

mvn temiz yüklemek -DmyDatabaseName = db/somedb

+0

Tamam, kulağa hoş geliyor. Metin değiştirme işleminin yer tutucusu olarak benim persistence.xml dosyasına yerleştirmek için neye ihtiyacım var? – Vinnie

+1

Pascal'ın yorumunu :-) –

+0

'a bakın. Farklı bağlantılarda farklı konumlarda yaklaşık 500 sunucuyu yönetmek zorunda olduğum için, orijinal soruyu sorduğumda nasıl bir çözüm bulmam gerekiyor. Daha fazla fikir, 500 savaş yapmak iyi bir şey değil: S – Vedran

1

Ben webapp iki sürümü paketlemek ve bunların ilgili persistence.xml (Ben WEB-INF/classes/META-INF/persistence.xml olması bekleniyor, bu dosyayı dışa sanmıyorum)

+0

Ah, bundan korktum. Basit bir yapılandırma değişikliği yapmak için birden çok kez yapılandırma, uygulama açısından daha fazla istemci eklendikçe ve yeni sürümler yayınlandıkça bakım perspektifinden kaynaklanan bir acı gibi görünüyor (10 istemcinin, birbiri arasında süreklilik dosyasında değişikliklerle 10 ayrı oluşturma ve dağıtma anlamına gelir)). Yapmak ve paketlemek için maven kullanıyorum. Birden fazla savaş üretebilecek bir maven eklentisi olup olmadığını biliyor musunuz, her bir yapılandırma için uygun kalıcılık xml mi alıyorsunuz? – Vinnie

+1

@Vinnie: [Filtreleme ve profiller] kullanmalıyım (http://www.sonatype.com/books/mvnref-book/reference/resource-filtering-sect-description.html) (ve benim CI motorumun tümünü oluşturmasına izin ver Yapı Matrisini kullanarak varyantlar). "Persistence.xml" inizde $ {foo} 'gibi bir şey bildirin ve değeri filtrelemek için Maven'ı kullanın. –

2

güncelleme:

http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html

emin bu bir appserver içinde kurulabilir ama bunu bir vereceğim eğer gitmek. Beni endişelendiren tek şey kapsam yönetimi. konteyner sorun


2.2.2

olan işlem sınırları

//inject entity manager 
@Inject("mySpecialEntityManager") 
EntityManager em; 

//then mark the actual factory method in the factory bean with  
@Produces("mySpecialEntityManager") 

ama sonra kapsamını nasıl yönetileceği boyunca kapsamını yönetir. Bootstrapping

JPA belirtimi EntityManagerFactory ve EntityManager'a erişmek için bir bootstrap prosedürü tanımlar. Önyükleme sınıfı, javax.persistence.Persistence'dir, örn.

Harita configOverrides = new HashMap();

configOverrides.put ("hibernate.hbm2ddl.auto", "create-drop");

EntityManagerFactory programmaticEmf =

Persistence.createEntityManagerFactory("manager1", configOverrides); 

ilk sürümü boş harita ikinci eşdeğerdir.Harita sürümü, persistence.xml dosyalarınızda tanımlanan tüm özelliklere göre öncelikli olan geçersiz kılma kümeleridir. Bölüm 2.2.1'de tanımlanan tüm özellikleri, “Ambalaj” createEntityManagerFactory yöntemine geçirilebilir ve birkaç ek olanlar vardır:

* 

    javax.persistence.provider to define the provider class used 
* 

    javax.persistence.transactionType to define the transaction type used (either JTA or RESOURCE_LOCAL) 
* 

    javax.persistence.jtaDataSource to define the JTA datasource name in JNDI 
* 

    javax.persistence.nonJtaDataSource to define the non JTA datasource name in JNDI 
* 

    javax.persistence.lock.timeout pessimistic lock timeout in milliseconds (Integer or String) 
* 

    javax.persistence.query.timeout query timeout in milliseconds (Integer or String) 
* 

    javax.persistence.sharedCache.mode corresponds to the share-cache-mode element defined in Section 2.2.1, “Packaging”. 
1

Ne META-INF klasöründeki bir persistence.xml depolama hakkında classes dizini ve ardından bu klasörü önce classpath içinde belirterek?

0

Ben bir Java SE ortamda yapmayı başardı budur . Ben bir manifest.mf dosyasını el ile oluşturdum ve Class-Path: koydu "." İhtiyacım olan diğer girişlere ek olarak.

Yazılımı yüklediğiniz dizinde, META-INF dizinini oluşturun ve persistence.xml'u buraya yerleştirin. Otomatik olarak alınmalı.

örn.

/my/install/dir/ 
       META-INF/persistence.xml 
       foo.jar 
İlgili konular