2008-09-23 19 views
8

Birden fazla veri tabanını desteklemek için aynı örnekte birden çok veritabanını desteklemem gereken bir gereksinim var. Her bir DB aynı şemaya sahiptir. Kullanıcı, bir listeden seçerek belirli bir veritabanına giriş yapar ve sonraki tüm çağrılar, çıkış yapana kadar bu DB'ye gider.İlkbahar/Hazırda Bekletme Altındaki Çoklu Oturum Fabrikaları

İstemci tarafından sağlanan bir parametreye dayanarak oturum fabrikasını tek bir HibernateDaoTemplate içinde değiştirmek istiyorum.

Çalışırken değiştirilebilir veri kaynakları (ve bunlarla ilişkili tüm işlem sorunları) üzerinde birçok şey bulabilirim, ancak takas oturumu fabrikalarını değiştirmek istiyorum - her biri için tüm önbelleğe alma işlemlerini koruyorum.

Bunu yapmanın en kolay yolu nedir? DaoTemplate için bir HotSwappableTarget yapılandırmak? Bunu yapmam için bana örnekler yollayabilir mi?

cevap

2

Tüm veritabanları aynıysa, tek bir SessionFactory kullanmayı ve aslında "kiracı farkında" olan DataSource ve Cache için kendi uygulamalarınızı sağlamanızı önerebilirim. (Bunları uygulamak oldukça önemsiz: sadece kiracı kimliği -> gerçek önbellek/gerçek veri kaynağının bir haritasını saklayın ve daha sonra tüm çağrıları uygun olana aktarın). Kiracı Farkında Önbellek ve DataSource'ınızı kullanmak için tek SessionFactory'yi yapılandırın. Bir ThreadLocal, geçerli isteğin kiracı kimliğini, hakkında bilmesi gereken herhangi bir kod için kullanılabilir hale getirmek için kullanılabilir.

Çoktan kiralamayı başarılı bir şekilde desteklemeden önce bu yaklaşımı kullandım.

+0

İyi fikir - ama kiracı farkında önbelleği nasıl değiştirirsiniz? Tek yapmanız gereken bir önbellek sağlayıcıyı yapılandırmaktır ve hazırda bekletme, bir önbellek oluşturmak için bunu kapakların altında kullanır. Belki de sırayla bir önbellek sarıcı oluşturmak bir CacheProvider? – Verdant

0

Ayrıca hazırda Shards proje bir göz sürebilir: Hazırda Core yatay bölünmesi için destek ekleyerek odaklanmıştır

http://www.hibernate.org/414.html

.... Henüz tam Hazırda Bekletme API'sini kapsamaz fakat bunun büyük bir kısmını destekler (ihtiyaçlarınız için yeterli olabilir veya olmayabilir). Tabii ki, tam kapsamaya doğru çalışıyorlar.

2

Çalıştığım yerde, bu işlemi ThreadLocal aracılığıyla gerçekleştirdik. this guide. Sadece bir SessionFactory kullandık ve oturum açtığımızda kullanıcının değiştirebileceği bir oturum değişkenine göre veri kaynağını değiştirdik. Tam ayrıntıları hatırlamıyorum, ancak İlgilendiğimize göre, uygulamalarımız hakkında daha fazla bilgi bulabilirim. Bununla birlikte, eski işyerindeki adamlar artık bu yaklaşımdan ve keskin bir veritabanına doğru hareket ediyorlar. Kesinlikle bakmanızı tavsiye edeceğim daha zarif bir çözüm.

1

HibernateDaoSupport adresinin DAO sınıfını genişleten, o zaman ben de ThreadLocal yoluyla önbellek sağlayıcı denenmiş ve zor bölümü önbelleği hot swap yapıyordu

0

veritabanlarının sıcak takas yapmak, setSessionFactory() yöntemini çağırmak SessionFactory'nin onunla herhangi bir aktif oturumun bulunmadığından emin olmalısınız. Şimdi, bence çok daha iyi bir çözüm var: Spring 3 java konfigürasyonunu kullanarak, kiracı farkında SessionFactory'yi dinamik olarak oluşturabilir ve Spring'in önbellek yönetimini sizin için yapmasını sağlayabilirsiniz.