У меня есть приложение с помощью servlets/JSP's Java. Существует несколько клиентов, использующих мое приложение, однако у каждого клиента есть отдельная база данных. Все базы данных имеют ту же схему. Я хотел бы определить, какое соединение с базой данных использовать в то время, когда пользователь входит в систему.
Например, клиент журналы в, я решаю, что клиент A принадлежит базе данных C, захватите соединение для базы данных C и продолжите мой веселый путь.
Я использую JPA с, в спящем режиме как мой поставщик JPA. Действительно ли возможно сделать это использование нескольких единиц персистентности и определение который единица использовать во время входа в систему? Существует ли лучший/предпочтительный способ сделать это?
Отредактированный для добавления: Я использую аннотации и EJB's, таким образом, Контекст Персистентности устанавливается в EJB с @PersistenceContext (unitName = "чепуха"), это может быть определено во время входа в систему? Я могу изменить unitName во времени выполнения?
Спасибо
1) Создайте несколько постоянных единиц в вашем persistence.xml
с разными именами.
2) Создайте необходимое количество EntityManagerFactory
s (1 на persistence-unit) и укажите, какой persistence-unit должен использоваться для конкретной фабрики:
<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="SpringSecurityManager"/>
</bean>
3) Создайте необходимое количество TransactionManager
s:
<bean id="authTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="authEntityManagerFactory" />
</bean>
4) В классах ваших DAO укажите, с какой persistence-unit (и, соответственно, с какой EntityManagerFactory) вы хотите работать:
public class AbstractAuthDao<T> {
@PersistenceContext (unitName = "SpringSecurityManager")
protected EntityManager em;
...
}
5) В ваших сервис-объектах укажите, какой TransactionManager должен использоваться (эта возможность поддерживается только в Spring 3. 0):
@Transactional (value = "authTransactionManager", readOnly = true)
public class UserServiceImpl implements UserService {
...
}
6) Если в вашем web.xml есть OpenEntityManagerInViewFilter
, то укажите в его init-param имя нужного EntityManagerFactory (или создайте несколько фильтров с соответствующими init-блоками):
<init-param>
<param-name>entityManagerFactoryBeanName</param-name>
<param-value>authEntityManagerFactory</param-value>
</init-param>