2016-11-23 4 views
0

У меня есть веб-приложение, которое использует Oracle DB в качестве источника данных на задней панели. Этот экземпляр Oracle DB обновляется ежедневно, и при его обновлении мы должны беспрепятственно переключаться на другую БД (копию исходного БД), а в то время как другая БД (копия) обновляется, она должна возвращаться к исходной БД Oracle.Двойное подключение к DB весной?

Мы используем Spring JDBC.

Каков наилучший способ достичь этого?

+0

Если вы прошу проголосовать, прошу оставить комментарий – Snickers3192

+0

Я не знаю, кто проголосовал за меня за задание этого вопроса. –

ответ

0

Поскольку решение, связанное с DevOps, не было решено, должностное лицо должно было выполнить AbstractRoutingDataSource.

Решение простое, все, что вам нужно сделать, это расширяет AbstractRoutingDataSource и обеспечивают критерии маршрутизации с помощью переопределения determineCurrentLookupKey() метод.

Ваш источник Customized данных будет выглядеть следующим образом

public class ResourceAwareMyDataSource extends AbstractRoutingDataSource { 

    private static final Logger logger = LoggerFactory.getLogger(ResourceAwareMyDataSource.class); 

    @Override 
    protected Object determineCurrentLookupKey() { 

     try { 
      //Check whether the primary DB is active 
      if(primaryIsActive()) { 
       return "Primary" 
      } 
     } catch (Exception e) { 
      logger.error("Error occurred when checking primary",e); 
      logger.info("Switching back to Secondary.."); 
      return "Secondary"; 
     } 
     //Primary is inactive 
     logger.info("Primary is Inactive, Switching back to Secondary"); 
     return "Secondary"; 
    } 
} 

Это будет вашей конфигурации Java для указанного выше источника данных

@Bean 
@Qualifier("myCustomizedDataSource") 
public DataSource resourceAwareMyDataSource() { 

    ResourceAwareMyDataSource dataSource = new ResourceAwareMyDataSource(); 
    Map<Object, Object> targetDataSourcesMap = new HashedMap(); 
    targetDataSourcesMap.put("Primary", getPrimaryDataSource()); 
    targetDataSourcesMap.put("Secondary", getSecondaryDataSource()); 
    dataSource.setTargetDataSources(targetDataSourcesMap); 
    return dataSource; 
} 

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

public DataSource getPrimaryDataSource() { 
    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setDriverClassName(...); 
    dataSource.setUrl(...); 
    dataSource.setUsername(...); 
    dataSource.setPassword(...); 
    dataSource.setValidationQuery(...); 
    return dataSource; 
} 

public DataSource getSecondaryDataSource() { 
    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setDriverClassName(...); 
    dataSource.setUrl(...); 
    dataSource.setUsername(...); 
    dataSource.setPassword(...); 
    dataSource.setValidationQuery(....); 
} 
0

Это во многом будет зависеть от ваших требований. Для этого я бы использовал Dev-op. Как Dev-ops вы хотите получить, зависит от вас. Просто комментарий тоже каждый раз, когда я вижу такой вопрос, как переключение баз данных весной или переработка одноэлементного боба и т. Д. Разработчик всегда делает что-то очень странное, часто потому, что считает, что у них есть определенное требование, но на самом деле это не так ,

Существуют инструменты Dev-ops, в которых есть только квитанции для чтения базы данных, которые могут быть обновлены из другого источника с частотой того, что вы хотите. Нет необходимости переключаться на другую базу данных, поскольку это происходит. (Также проверьте шаблон, в котором есть много клонов только для чтения базы данных и одна «настоящая» база данных, в которую перенаправляются все записи).

Даже если это не соответствует вашим требованиям, вы можете использовать Dev-ops, чтобы визуализировать URL-адрес порта и базы данных и т. Д. И перенаправлять его где угодно и когда захотите. Я бы тоже убил все сеансы между этим прыжком, но это только я.

Использование Dev-ops позволит сохранить этот вид вещей из кода вашего веб-приложения Spring, поэтому он остается чистым и код не нуждается в изменении при изменении этого требования. Это будет неприятно работать с проектом, в котором этот материал жестко закодирован, я советую вам осторожно подумать о том, какую дорогу вы возьмете. Если вы перейдете в Dev-ops, тогда у вас не будет этих проблем.

+0

На самом деле я указал, что, когда это было задано, к сожалению, это не варианты (по крайней мере, на данный момент). То, что я ищу, - это связанное с Connection Pooling решение (что-то вроде этого http://stackoverflow.com/questions/8520255/can-i-use-one-pooled-datasource-for-multiple-databases-with-spring-hibernate- c3p), PS - Я не собираюсь голосовать за вас, так как ваш ответ действителен. –

+0

Комментарий был направлен на то, кто проголосовал за вас, а не за вас. Я не знаю вашу ситуацию, или если вы пробовали. Но я думаю, вы должны попробовать и продать решение dev-ops.В противном случае вы можете повторно развернуть свой webapp с различными настройками. – Snickers3192

+0

Спасибо за ваш ответ. Действительно ценю это. –

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