Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Лучший способ распределить транзакции по нескольким базам данных: Не делайте этого.
Некоторые люди укажут вам на XA, но XA (или двухфазная фиксация) - это ложь (или маркетолог).
Представьте: после того, как на первом этапе диспетчер XA сообщил, что он может отправить последнюю фиксацию, сетевое соединение с одной из баз данных не работает. Что теперь? Тайм-аут? Это приведет к повреждению другой базы данных. Откат? Две проблемы: вы не можете откатить фиксацию и как узнать, что случилось со второй базой данных? Может быть, сетевое соединение не удалось после того, как оно успешно зафиксировало данные, и было потеряно только сообщение «успех»?
Лучший способ - скопировать данные в одном месте. Используйте схему, которая позволяет прервать копирование и продолжить ее в любое время (например, игнорировать данные, которые у вас уже есть, или заказывать выборку по ID и запрашивать только записи> MAX (ID) вашей копии). Защитите это транзакцией. Это не проблема, поскольку вы только читаете данные из источника, поэтому, когда транзакция завершается неудачно по какой-либо причине, вы можете игнорировать исходную базу данных. Следовательно, это обычная старая транзакция с одним источником.
После того, как вы скопировали данные, обработайте их локально.
Установите менеджер транзакций в своем контексте. Документы Spring имеют примеры, и это очень просто. Тогда, когда Вы хотите выполнить транзакцию:
try {
TransactionTemplate tt = new TransactionTemplate(txManager);
tt.execute(new TransactionCallbackWithoutResult(){
protected void doInTransactionWithoutResult(
TransactionStatus status) {
updateDb1();
updateDb2();
}
} catch (TransactionException ex) {
// handle
}
Для большего количества примеров и информации, возможно, смотрят на это: транзакции XA с помощью Spring
При высказывании "двух различных баз данных" Вы имеете в виду различные серверы баз данных или две различных схемы в том же сервере БД?
, Если первый, то, если Вы хотите полный transactionality, тогда Вам нужен API транзакции XA, который обеспечивает полную двухфазную фиксацию. Но что еще более важно, Вам также нужен координатор/монитор транзакции, который справляется с распространением транзакции между различными системами баз данных. Это - часть спецификации JavaEE и довольно утонченная часть ее в этом. Координатор Техаса самостоятельно является сложной частью программного обеспечения. Ваше прикладное программное обеспечение (через Spring, если Вы так желаете) говорит с координатором.
, Если, однако, Вы просто имеете в виду две базы данных в том же сервере БД, затем ваниль, транзакции JDBC должны работать просто великолепно, просто выполнить Ваши операции против обеих баз данных в единственной транзакции.
В этом случае Вы нуждались бы в Мониторе транзакций (сервер, поддерживающий протокол XA), и удостоверились бы, что Ваши базы данных поддерживают XA также. Большинство (все?) серверы J2EE идет со встроенным Монитором транзакций. Если Ваш код работает не в сервере J2EE тогда существует набор автономных альтернатив - Atomicos, Bitronix, и т.д.