2015-03-05 3 views
0

Я разрабатываю приложение Java, используя Spring + Hibernate. Я хочу, чтобы это приложение работало в более чем одной базе данных одновременно.Как я могу разработать приложение, которое будет работать в нескольких баз данных одновременно с помощью Spring + Hibernate?

Для примера, если пользователь пытается найти некоторые данные, приложение должно одновременно искать эти данные во всех настроенных источниках данных.

Я ищу решение, которое будет создавать различные темы для каждого источника данных и когда пользователь выполняет любую операцию, все нитям необходимы для выполнения этой операции

Edit 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

Таким образом, базы данных будут иметь идентичный контент? Или ваше приложение должно решить, какую базу данных или базы данных хранить каждый элемент? –

+0

Вы думали о репликации базы данных вместо этого? –

+0

Как будто я пытаюсь проверить стат данных для всей настроенной базы данных. Таким образом, приложение должно выполнять одну и ту же операцию во всех настроенных базах данных. – Kushal

ответ

1

У вас может быть несколько объектов SessionFactory или EntityManagerFactory, каждый из которых связан с различными DataSource. Если вы хотите управлять транзакцией в разных источниках данных, я бы рекомендовал использовать JTA Transaction Manager. Если ваше приложение не работает в среде Java EE, вы можете использовать какой-либо сторонний менеджер транзакций JTA, например Atomikos Transaction Manager

В Stackoverflow есть несколько потоков, которые обсуждают эту проблему. Try this

Edit 1: Если вы NEET для выбора источников данных по имени, чем ваш DAO может реализовать BeanFactoryAware и вы получите BeanFactory объект, который можно использовать для доступа к SessionFactory фасоли по имени. Ваш код должен выглядеть примерно так

@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; 
    } 
} 
+0

Проблема с данным решением заключается в том, что каждый раз, когда вы добавляете новый источник данных, вам нужно пойти и добавить новый объект фабрики сессии в свой код, я ищу какое-то общее решение. – Kushal

+0

Да, но вам не нужно менять свой код, чтобы добавить новый 'SessionFactory'. Вам просто нужен класс, способный создавать объекты SessionFactory. Это так же общее, как вы собираетесь получить. @Kushal –

+0

Это может быть основная вещь, но я не знаю, как написать этот общий класс, который я могу использовать для создания 'SessionFactory', вы можете мне помочь. – Kushal

 Смежные вопросы

  • Нет связанных вопросов^_^