如何使用Spring + Hibernate开发一个可以同时在多个数据库上运行的应用程序?

时间:2015-03-05 07:30:05

标签: java spring hibernate multiple-databases

我正在使用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,因此需要对作为参数提供的所有数据源执行此操作。我必须为此做些什么改变? 提前致谢

1 个答案:

答案 0 :(得分:1)

您可以拥有多个SessionFactoryEntityManagerFactory个对象,每个对象与不同的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;
    }
}