我正在使用Spring + Hibernate开发Java应用程序。我希望这个应用程序能够同时在多个数据库上运行。
例如,如果用户尝试搜索某些数据,则Application必须同时在所有已配置的数据源中搜索该数据。
我正在寻找一种解决方案,它将为每个数据源创建不同的线程,当用户执行任何操作时,所有线程都需要执行该操作
修改1 让我在下面详细解释我的问题是我的DAO课程
@Repository("engineDAO")
public class EngineDAOImpl implements EngineDAO {
@Autowired
private SessionFactory sessionFactory;
@Override
public void persistEngine(Engine engine, String[] DataSourceNames) {
sessionFactory.getCurrentSession().persist(engine);
}
}
现在从服务类我将调用persistEngine
类的EngineDAO
方法,其参数为String[] DataSourceNames
,因此需要对作为参数提供的所有数据源执行此操作。我必须为此做些什么改变?
提前致谢
答案 0 :(得分:1)
您可以拥有多个SessionFactory
或EntityManagerFactory
个对象,每个对象与不同的DataSource
相关联。如果您想跨不同数据源管理事务,我建议使用JTA Transaction Manager
。如果您的应用程序未在Java EE环境中运行,则可以使用某些第三方JTA事务管理器,例如Atomikos Transaction Manager
Stackoverflow上有一些线程讨论这个问题。 Try this
修改1 :
如果您需要按名称选择数据源,则DAO可以实现BeanFactoryAware
,您将获得BeanFactory
对象,您可以使用该对象按名称访问SessionFactory
bean。
您的代码应该类似于
@Repository("engineDAO")
public class EngineDAOImpl implements EngineDAO, BeanFactoryAware {
private org.springframework.beans.factory.BeanFactory beanFactory;
@Override
public void persistEngine(final Engine engine, final String[] sessionFactoryNames) {
for (final String sessionFactoryName : sessionFactoryNames) {
final SessionFactory sessionFactory = beanFactory.getBean(sessionFactoryName, SessionFactory.class);
sessionFactory.getCurrentSession().persist(engine);
}
}
@Override
public void setBeanFactory(final BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}