Spring: отдельный источник данных для транзакций только для чтения

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

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

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

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
    }
}

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

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

8
задан artemb 19 July 2010 в 12:25
поделиться

1 ответ

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

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

4
ответ дан 6 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: