2015-06-15 3 views
2

У меня есть следующая проблема. Есть 2 источника данных для 2 dbs: current (A) и stand by (B). Если A не отвечает, я попытаюсь подключить B.Изменение свойств пружинных компонентов на лету

Вот как я это понимаю.

  • перехватчик проверяет соединение является плохим
  • перехватчик будет поменять URL источника данных, если что-то идет неправильно

Источников данных являются пружинными бобами. Поэтому я изменяю свойства весеннего компонента на лету. Это нормально? Посмотрите на код:

@Autowired 
@Qualifier("dataSourceMain") 
private oracle.jdbc.pool.OracleDataSource dsMain; 

@Autowired 
@Qualifier("dataSourceStandBy") 
private oracle.jdbc.pool.OracleDataSource dsStandBy; 

public void swapURL() { 
    try { 
     String dsMainURL = dsMain.getURL(); 
     dsMain.setURL(dsStandBy.getURL()); 
     dsStandBy.setURL(dsMainURL); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

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

+2

ИМХО вы не должны этого хака, как это должно быть что-то обеспечивается драйвером JDBC и/или пул соединений используется. –

+1

Это источник данных, который объединяет пул, URL-адрес будет работать только для вновь созданных подключений. Уже имеющееся соединение по-прежнему указывает на старый URL-адрес, пока все они не будут оставлены. Вы используете oracle, поэтому я предлагаю настроить надлежащий переход на другой ресурс и использовать Spring Data JDBC для настройки этой ситуации восстановления после отказа, вместо того, чтобы переводить свои собственные. –

+0

Согласовано - драйвер MySQL jdbc, например, позволяет вам добавлять в список URL-адреса базы данных, которые доступны при циклическом обращении при попытке получить соединение. Я не уверен, что Oracle предоставляет это в своем драйвере jdbc. – PaulNUK

ответ

2

Проверьте, подходит ли вам эта проблема? Похоже, вопрос похож

dynamically change Spring data source

который, кажется, сделать более изящным способом

+0

Правильно ли изменяю свойства? – Tony

+0

Если URL-адрес - это единственное, что вам нужно переключить, да, похоже, все в порядке. Я предполагаю, что ваш пользователь, пароли и конфигурации одинаковы для обоих источников данных, конечно. – Massimo

2

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

В общем случае я предлагаю вам использовать AbstractRoutingDataSource для безопасной замены источников данных. Смотрите здесь

How to make safe frequent DataSource switches for AbstractRoutingDataSource?

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