2010-07-19 4 views
8

Спасибо, что прочитал это.Весна: отдельный источник данных для транзакций только для чтения

У меня есть 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 
    } 
} 

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

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

ответ

4

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

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

+0

Есть ли более простой способ с AspectJ, например? – artemb

+0

@artemb: Я уверен, что AspectJ поможет, но это все равно будет нелегко. – skaffman