2012-05-11 1 views
0

Мне нужно разработать некоторые службы и предоставить API некоторым третьим лицам. В этих службах мне может потребоваться выборка/вставка/обновление/удаление данных с использованием некоторых сложных вычислений (а не просто CRUD). Я планирую использовать Spring и MyBatis.Лучший подход для Spring + MyBatis с несколькими базами данных для поддержки отказоустойчивости

Но реальная проблема заключается в том, что будут несколько узлов БД с одинаковыми данными (некоторые внешние настройки позаботятся об их синхронизации). Когда я получил запрос на некоторые данные, мне нужно случайно выбрать один узел БД и запросить его и вернуть результаты. Если выбранная БД недоступна или имеет некоторые сетевые проблемы или неизвестную проблему, мне нужно попытаться подключиться к другому узлу БД.

Мне известно о SpringRoutingDataSource от Spring. Но куда вводить логику повторного подключения DB Connection? Будет ли Spring обрабатывать транзакции правильно, если я динамически переключаю dataSource?

Или я должен избегать весны & Интеграция MyBatis из готового продукта и управление транзакциями самостоятельно с помощью MyBatis?

Что вы предлагаете?

+0

Зачем выбирать базу данных наугад для каждого запроса? Почему бы не использовать один сервер, пока вы не поймете, что с ним что-то не так? – Killnine

ответ

1

Я предлагаю вам использовать базу данных NoSQL, такую ​​как MongoDB. Это простая кластеризация. Вы можете настроить, например, использовать 10 серверов и выполнять репликацию данных 3 раза.

Это означает, что если 2 из ваших 10 серверов не удались - у вас все еще есть сохранение данных.

Базы данных NoSQL различаются по сравнению с RDBS, но они могут обеспечить высокую производительность для кластеризации.

Кроме того, нет поддержки транзакций для NoSQL - вы должны сделать это вручную в случае финансовых операций.

На самом деле, при разработке с NoSQL вы должны по-разному действовать.

+0

Спасибо за ваш ответ. но на данный момент у меня нет выбора перейти на NoSQL. –

1

Да, это сработает. Получите AbstractRoutingDataSource и создайте собственный код. Единственное, что вы не можете сделать, это изменить целевую базу данных во время выполнения транзакции.

Итак, что вам нужно сделать, это поместить код повтора db в getConnection. Если во время транзакции это соединение становится недействительным, вы должны позволить ему сбой.

+0

Мое требование немного сложнее ... Мне нужно повторить попытку не только для сбоев соединения, но также, если я не могу получить блокировку для конкретной таблицы, получил некоторые восстанавливаемые исключения db. Поэтому я разрабатываю расширение для AbstractRoutingDataSource для поддержки всех этих механизмов повтора. Я опубликую эту информацию о расширении на своем блоге www.sivalabs.blogspot.com после завершения. –