Spring: отдельный источник данных для транзакций только для чтения - PullRequest
8 голосов
/ 19 июля 2010

Спасибо за чтение.

У меня есть 2 базы данных MySQL - master для записи, slave для чтения.Идеальный сценарий, который я представляю, состоит в том, что мое приложение использует соединение с мастером для readOnly=false транзакций, подчиненное для readOnly=true транзакций.

Для реализации этого мне необходимо предоставить действительное соединение в зависимости от типа текущегосделка.Мой уровень обслуживания данных не должен знать, какой тип соединения он использует, и просто использует введенный SqlMapClient (я использую iBatis) напрямую.Это означает, что (если я правильно понял) введенные SqlMapClient s должны быть проксированы, а делегат должен быть выбран во время выполнения.

public class MyDataService {

    private SqlMapClient sqlMap;

    @Autowired
    public MyDataService (SqlMapClient sqlMap) {
        this.sqlMap = sqlMap;
    }

    @Transactional(readOnly = true)
    public MyData getSomeData() {
        // an instance of sqlMap connected to slave should be used
    }

    @Transactional(readOnly = false)
    public void saveMyData(MyData myData) {
        // an instance of sqlMap connected to master should be used
    }
}

Итак, вопрос - как я могу это сделать?

Большое спасибо

1 Ответ

4 голосов
/ 19 июля 2010

Это интересная идея, но у вас будет тяжелая работа в ваших руках.Атрибут readOnly задуман как подсказка для менеджера транзакций и на самом деле не используется нигде.Вам придется переписать или расширить несколько классов инфраструктуры Spring.

Так что, если вы не одержимы желанием заставить эту работу работать так, как вам хочется, ваш лучший вариант - почти наверняка ввести два отдельных объекта SqlMapClient вваш DAO, и для методов, чтобы выбрать подходящий.Аннотации @Transactional также должны указывать, какой менеджер транзакций использовать (при условии, что вы используете DataSourceTransactionManager вместо JpaTransactionManager), стараясь сопоставить менеджер транзакций с DataSource, используемым SqlMapClient.

...