Спасибо за чтение этого.
У меня есть 2 базы данных MySQL - ведущее устройство для записей, ведомое устройство для чтений. Идеальный сценарий, который я воображаю, - то, что мое приложение использует соединение с ведущим устройством для 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
}
}
Таким образом, вопрос - как я могу сделать это?
Большое спасибо
Идея интересная, но у вас будет тяжелая работа. Атрибут readOnly
предназначен как подсказка для диспетчера транзакций, и на самом деле он не используется в каких-либо значимых местах. Вам придется переписать или расширить несколько классов инфраструктуры Spring.
Так что, если вы не одержимы желанием добиться того, чтобы это работало, ваш лучший вариант почти наверняка - вставить два отдельных объекта SqlMapClient
в ваш DAO и выбрать для методов подходящий. . Аннотации @Transactional
также должны указывать, какой диспетчер транзакций использовать (при условии, что вы используете DataSourceTransactionManager
, а не JpaTransactionManager
), стараясь соответствовать транзакции. к источнику данных
, используемому SqlMapClient
.