2012-05-17 2 views
0

В моем приложении mvc весны мне нужно подключиться к нескольким базам данных в определенное время на основе функциональности, выбранной пользователем в интерфейсе. Скажу:Управление несколькими источниками данных в Spring MVC

1.I имеет 3 различных сред (Prod, PRE-Прод и стадирование и многое другое ...)

2.User хочет видеть список таблиц из данной базы данных. Пользователь выберет элемент из поля выбора и отправит его. Основываясь на выборе пользователя, ему необходимо подключиться к соответствующей базе данных и получить результаты.

3.Some раз некоторые базы данных могут пойти вниз и если я создаю источник данных JNDI для каждой базы данных и сопоставить их JdbcTemplate и все эти jdbcTemplaates определяются как свойства в моей DAO как

<bean id="prodDataSource" ref="prodDSPool"/> 
<bean id="preProdDataSource" ref="preProdDSPool"/> 
<bean id="statgingDataSource" ref="stagingDSPool" /> 
... 
... 

И у меня есть еще один компонент, который является ничем иным, кроме моего DAO

<bean id="myConnectionsDAO" class="com.example.MyConnectionsDAOImpl"> 
     <property name="prodDataSource"> 
      <ref bean="prodDataSource"/> 
     </property> 
     <property name="preProdDataSource"> 
      <ref bean="preProdDataSource"/> 
     </property> 
     <property name="preProdDataSource"> 
      <ref bean="preProdDataSource"/> 
     </property> 
</bean> 

и MyConnectionDAO является POJO с геттер и сеттеры для перечисленных выше свойств.

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

if(env.equalsIgnoreCase(EnvEnum.PROD.toString()) 
{ 
    JdbcTemplate prodTemplate = new JdbcTemplate(myConnectionsDAO.getProdDataSource()); 
prodTemplate.queryForList("select name form sysibm.systables where creator='admin'); 
//Core business logic to analyze those tables and proceed... 
}else if {//preprod logic} else if{//staging logic} 

И у меня есть много сложной функциональность, играющая вокруг данных из базы данных DB2 , Поскольку я вводя данные, источники данных относятся к моему dao с использованием Spring config; по какой-либо причине, если одна база данных/источник данных не работает, я не могу использовать мое приложение и получать nullpointer, поскольку один или несколько источников данных не работают.

Как я могу справиться с этими ошибками? В основном я хочу, чтобы мое приложение работало, если хотя бы один ds. И у меня около 50 баз данных, настроенных с использованием вышеприведенной конфигурации.

Я в значительной степени смущен и не понимаю, как решить эту проблему. Спасибо заранее, ребята ...

ответ

0

В принципе вам нужно будет управлять собственным контекстом приложения Spring для базы данных.

То есть вы начнете использовать контекст приложения в качестве дочернего элемента вашего корня application context для данной базы данных. Затем вам нужно будет управлять жизненным циклом динамического контекста приложения db/datasource в будущем.

Другой вариант - написать пользовательский сингл Datasource, который автоматически выполняет эту маршрутизацию за кулисами. Что на основе ваших изменений выглядит как лучший вариант.

public class RoutingDatasource implements DataSource, ApplicationContextAware { 

    private volatile DataSource realDataSource; 
    private ApplicationContext ac; 

    // You must do some thread locking here that will be rather complicated. 
    // That is not included in this example 
    public void switchDatasource(String name) { 
     this.realDataSource = this.ac.getBean(name, DataSource.class); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     this.ac = applicationContext; 
    } 

    // delegate to realDataSource 


} 

Вам необходимо выяснить, как безопасно заблокировать объект источника данных. Я оставлю это для вас (извините, что закончилось время).

+0

Можете ли вы дать мне образец кода для того же самого. Если я пишу пользовательский источник данных, и если нужно добавить поддержку для большего количества баз данных, это будет громоздким каждый раз, когда редактирование классов будет правильным? Является ли пружина каким-либо механизмом для работы с этим ящиком? – springpress

+0

Вы знаете, что ваш пользовательский источник данных будет весенним. См. ApplicationContextAware. Возможно, вы можете придумать некоторые схемы именования для реальных источников данных, а затем в вашем источнике данных маршрутизации вы сделаете что-то вроде applicationContext.getBean() .... –

+0

У меня есть я написал свой собственный источник данных только для переключения схемы с помощью TransactionAwareDataSourceProxy, но в некоторых случаях мне нужны две или несколько разных баз данных для выполнения некоторой логики. Получайте метаданные из одной базы данных и проверяйте значения в другом db. В этом случае я не смогу использовать решение RoutingDataSource. Thaks – springpress

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