Изменить свойство / значение bean-компонента во время выполнения весной - PullRequest
5 голосов
/ 10 ноября 2011

Я использую Spring mvc + Hibernate + две базы данных

Так, например: я создаю 2 sessionFactories.sessionFactory1 (с использованием datasource1) и sessionFactory2 (с использованием datasource2).

Можно ли изменить sessionFactory1 или sessionFactory2 на sessionFactory во время выполнения, чтобы ссылки dao / sих.sessionFactory уже автоматически подключен ко всем dao / s.

Я сейчас ищу его, я думаю, что @Configuration может помочь мне, но я не уверен.

Я пытаюсь AbstractRoutingDataSource, но недумаю, что это помогает.

Ответы [ 2 ]

2 голосов
/ 30 августа 2012

Обычно Spring связывает ваши bean-компоненты при запуске приложения, поэтому «перемонтирование» (замена ссылок на sessionFactory1 ссылками на sessionFactory2 во время выполнения) не кажется простым для реализации.

Возможно, вы могли бы реализовать «прокси»bean-компонент ", который связан с вашими объектами DAO и меняет" target SessionFactory "вашего прокси-компонента.

0 голосов
/ 03 октября 2012

AbstractRoutingDataSource будет работать для вас.

Сначала вам нужно создать класс, который будет хранить текущую используемую БД:

public class MyContextHolder {

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

    public static void setDBContext(String dBContext) {
        contextHolder.set(dBContext);
    }

    public static String getDBContext() {
        return (String) contextHolder.get();
    }

    public static void clearDBContext() {
        contextHolder.remove();
    }

}

Вам нужно будет создать класс, который расширяет этот класс и реализует defineCurrentLookupKey (), и возвращает текущий дБ, который у вас есть в вашем держателе контекста:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class MyRoutingDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return MyContextHolder.getDBContext();
    }
}

См. Пример в http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/. У меня все работало нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...