Что 'лучший' путь состоит в том, чтобы сделать распределенные транзакции через несколько баз данных с помощью Spring и Быть в спящем режиме

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

30
задан Arjan Tijms 23 July 2013 в 21:11
поделиться

4 ответа

Лучший способ распределить транзакции по нескольким базам данных: Не делайте этого.

Некоторые люди укажут вам на XA, но XA (или двухфазная фиксация) - это ложь (или маркетолог).

Представьте: после того, как на первом этапе диспетчер XA сообщил, что он может отправить последнюю фиксацию, сетевое соединение с одной из баз данных не работает. Что теперь? Тайм-аут? Это приведет к повреждению другой базы данных. Откат? Две проблемы: вы не можете откатить фиксацию и как узнать, что случилось со второй базой данных? Может быть, сетевое соединение не удалось после того, как оно успешно зафиксировало данные, и было потеряно только сообщение «успех»?

Лучший способ - скопировать данные в одном месте. Используйте схему, которая позволяет прервать копирование и продолжить ее в любое время (например, игнорировать данные, которые у вас уже есть, или заказывать выборку по ID и запрашивать только записи> MAX (ID) вашей копии). Защитите это транзакцией. Это не проблема, поскольку вы только читаете данные из источника, поэтому, когда транзакция завершается неудачно по какой-либо причине, вы можете игнорировать исходную базу данных. Следовательно, это обычная старая транзакция с одним источником.

После того, как вы скопировали данные, обработайте их локально.

32
ответ дан 27 November 2019 в 23:59
поделиться

Установите менеджер транзакций в своем контексте. Документы Spring имеют примеры, и это очень просто. Тогда, когда Вы хотите выполнить транзакцию:

try { 
    TransactionTemplate tt = new TransactionTemplate(txManager);

    tt.execute(new TransactionCallbackWithoutResult(){
    protected void doInTransactionWithoutResult(
            TransactionStatus status) {
        updateDb1();
        updateDb2();
    }
} catch (TransactionException ex) {
    // handle 
}

Для большего количества примеров и информации, возможно, смотрят на это: транзакции XA с помощью Spring

6
ответ дан nhahtdh 27 November 2019 в 23:59
поделиться

При высказывании "двух различных баз данных" Вы имеете в виду различные серверы баз данных или две различных схемы в том же сервере БД?

, Если первый, то, если Вы хотите полный transactionality, тогда Вам нужен API транзакции XA, который обеспечивает полную двухфазную фиксацию. Но что еще более важно, Вам также нужен координатор/монитор транзакции, который справляется с распространением транзакции между различными системами баз данных. Это - часть спецификации JavaEE и довольно утонченная часть ее в этом. Координатор Техаса самостоятельно является сложной частью программного обеспечения. Ваше прикладное программное обеспечение (через Spring, если Вы так желаете) говорит с координатором.

, Если, однако, Вы просто имеете в виду две базы данных в том же сервере БД, затем ваниль, транзакции JDBC должны работать просто великолепно, просто выполнить Ваши операции против обеих баз данных в единственной транзакции.

5
ответ дан skaffman 27 November 2019 в 23:59
поделиться

В этом случае Вы нуждались бы в Мониторе транзакций (сервер, поддерживающий протокол XA), и удостоверились бы, что Ваши базы данных поддерживают XA также. Большинство (все?) серверы J2EE идет со встроенным Монитором транзакций. Если Ваш код работает не в сервере J2EE тогда существует набор автономных альтернатив - Atomicos, Bitronix, и т.д.

3
ответ дан maximdim 27 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: