Как использовать несколько источников данных (один для чтения и другой для записи) в рамках одной транзакции в Spring? - PullRequest
0 голосов
/ 09 января 2019

Я настроил две базы данных. Один для чтения (только для чтения), другой для операций чтения-записи. У меня есть сервис, который включает в себя операции чтения и записи. Я хотел бы использовать базу данных только для чтения для всех операций чтения, а другую базу данных - для операций записи. Как я мог добиться этого с помощью транзакций Spring. Я реализовал подход, основанный на аннотациях, который изменяет источник данных, используя AbstractRoutingDataSource. Но каждый раз, когда мне нужно создать новый переход, используя propogation = Require_New. Есть ли лучший способ сделать это?

@DbSource(DbType.READ_REPLICA)
@Transactional(propogation=Requires_New)
public Object readData(long id) {
   return dataDao.find(id);
}

1 Ответ

0 голосов
/ 09 января 2019

Вы должны создать отдельные конфигурации пружин для обоих ваших хранилищ данных вместе с TransactionManager бобами. По крайней мере один из этих bean-компонентов должен иметь значение name, чтобы при необходимости можно было использовать надлежащий менеджер транзакций:

@Transactional(transactionManager="DS1transactionManagerBeanName")
// DS1dataStoreRelevant class/method

Конечно, объединение логики, которая использует оба хранилища данных в одной транзакции, невозможно с JpaTransactionManager. Если это то, что вы ищете, вам следует рассмотреть возможность использования распределенной JtaTransactionManager, предоставляемой веб-контейнером, таким как IBM WebSphere, или другим, например, Atomikos / Bitronix и т. Д., Который обеспечивает транзакционность между различными хранилищами данных (ресурсы XA в целом).

В некоторых случаях возможный обходной путь (например, хранилища данных Oracle) может заключаться в обеспечении видимости из одной базы данных в другую и использовании единого хранилища данных / менеджера транзакций, но я не совсем уверен, как это работает на стороне базы данных.

Самым основным решением было бы просто не смешивать логику, влияющую на каждое хранилище данных, и упорядочивать ее в последовательных транзакциях, но, как уже говорилось, вся цепочка операций сама по себе не будет транснациональной, поэтому возможный откат будет применяться только к текущей транзакции (нет откат к совершенным ранее). Требуется некоторая дополнительная логика для введения политики отката / повтора с грязными флагами и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...