Спасибо, что прочитал это.Весна: отдельный источник данных для транзакций только для чтения
У меня есть 2 базы данных MySQL - мастер для записи, подчиненный для чтения. Идеальный сценарий, который я предполагаю, заключается в том, что мое приложение использует подключение к master для транзакций 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
}
}
Так что вопрос в том, - как я могу это сделать?
Большое спасибо
Есть ли более простой способ с AspectJ, например? – artemb
@artemb: Я уверен, что AspectJ поможет, но это все равно будет нелегко. – skaffman