2010-02-22 21 views
17

Mam aplikacji przy użyciu servlets Java/JSP. Z mojej aplikacji korzysta wielu klientów, jednak każdy klient ma oddzielną bazę danych. Wszystkie bazy danych mają ten sam schemat. Chciałbym określić, które połączenie z bazą danych ma być używane w czasie, gdy użytkownik loguje się do systemu.Jak połączyć się z wieloma bazami danych przy użyciu WZP?

Na przykład, klient loguje się, ustalam, że klient A należy do bazy danych C, przechwytuje połączenie dla bazy danych C i kontynuuje moją wesołą drogę.

Używam JPA z Hibernate jako mój dostawca JPA. Czy można to zrobić za pomocą wielu jednostek trwałości i określając, która jednostka ma być używana w czasie logowania? Czy jest lepszy/preferowany sposób to zrobić?

Edytowane w celu dodania: Używam adnotacji i EJB, więc Kontekst trwałości jest ustawiany w EJB z @PersistenceContext (unitName = "blahblah"), czy można to ustalić przy logowaniu? Czy mogę zmienić unitName w czasie wykonywania?

Dzięki

Odpowiedz

16

1) utworzyć kilka trwałych jednostek w twojej persistence.xml z różnymi nazwami.

2) Tworzenie niezbędną liczbę EntityManagerFactory S (1 za trwałości jednostce) oraz określić trwałość urządzenia należy stosować w betoniarni:

<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="SpringSecurityManager"/> 
</bean> 

3) Tworzenie niezbędną liczbę TransactionManager s:

<bean id="authTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="authEntityManagerFactory" /> 
</bean> 

4) W klasach Twojego DAO jest określenie, z którym wytrwałość-unit (a więc z którym EntityManagerFactory) chcesz pracować:

public class AbstractAuthDao<T> { 

    @PersistenceContext (unitName = "SpringSecurityManager") 
    protected EntityManager em; 

    ... 
} 

5) w usłudze-obiektów określić, które powinny być wykorzystywane TransactionManager (ta funkcja jest obsługiwana tylko w Spring 3.0):

@Transactional (value = "authTransactionManager", readOnly = true) 
public class UserServiceImpl implements UserService { 

    ... 
} 

6) Jeśli masz OpenEntityManagerInViewFilter w web.xml, następnie określić w jego nazwa-inicjatora niezbędnego EntityManagerFactory (lub utworzyć kilka filtrów z odpowiednimi blokami init):

<init-param> 
    <param-name>entityManagerFactoryBeanName</param-name> 
    <param-value>authEntityManagerFactory</param-value> 
</init-param> 
+0

Kto powiedział, że OP wykorzystuje Spring? :) –

+0

Zrobiłem tę sugestię przed edytowaniem pytania. – Roman

+0

Aby być uczciwym, nigdy nie wspominałem o Spring w oryginalnym poście, edycja po prostu dodała więcej informacji, ale to doprowadziło mnie do odpowiedzi, która wydaje się, że będzie to praca, więc została przyjęta. – kgrad

Powiązane problemy