我正在使用 Spring + Hibernate 开发 Java 应用程序。我希望这个应用程序同时在多个数据库上运行。
For Example if user tries to search for some data, Application has to search for that data in all the configured data-sources at a same time.
我正在寻找一种解决方案,该解决方案将为每个数据源创建不同的线程,并且当用户执行任何操作时,所有线程都需要执行该操作
编辑 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);
}
}
现在,从服务类中,我将调用 EngineDAO
类的 persistEngine
方法,参数为 String[] DataSourceNames
,因此需要执行此操作作为参数提供的所有数据源。为此我必须做出哪些改变?
提前致谢
最佳答案
您可以拥有多个 SessionFactory
或 EntityManagerFactory
对象,每个对象与不同的 DataSource
关联。如果您想管理跨不同数据源的事务,我建议使用JTA Transaction Manager
。如果您的应用程序不是在Java EE环境中运行,您可以使用一些第3方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;
}
}
关于java - 如何使用 Spring + Hibernate 开发一款可以同时在多个数据库上运行的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28872295/