Когда использовать источник данных XA и источник данных не XA - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь понять, как использовать источник данных Java XA. Но я до сих пор не могу понять, когда его использовать, а когда не использовать.

Я прочитал, что источник данных XA используется, когда мы используем две базы данных. Но я не уверен, что означает две базы данных.

Например:

У меня было два слоя классов (Сервис и DAO)

Метод на уровне сервиса, аннотированный как транзакция, вызывает два метода в DAO.

Каждый метод в DAO открывает новое соединение с базой данных и закрывает его в конце метода.

Если я использую один экземпляр базы данных, и каждый метод в DAO записывает в другую таблицу, должен ли я использовать источник данных XA? поскольку транзакция произошла на уровне сервиса, но только в одной базе данных

1 Ответ

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

Системы, такие как базы данных, а также, например, системы очередей, которые вы используете через JMS, имеют концепцию транзакций . Транзакция рассматривается как единица работы; в конце выполнения работы, такой как вставка, обновление или удаление записей в базе данных, вы фиксируете транзакцию, а затем база данных окончательно выполняет работу; или вы откатываете транзакцию, а затем все, что сделано в транзакции, отменяется.

В некоторых случаях ваше программное обеспечение должно выполнять операции в нескольких разных системах. Например, вам может понадобиться вставить данные в несколько баз данных или вставить что-то в базу данных и поместить сообщение в очередь.

Если вы хотите выполнять такие комбинации операций, как если бы они были в одной транзакции, то вам нужна система распределенных транзакций - система, которая может объединять транзакции разных систем в одну. Таким образом, вы можете написать свой код, как будто он выполняется внутри одной транзакции; система распределенных транзакций автоматически фиксирует или откатывает транзакции в базовых системах.

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

XA - это стандарт для работы с распределенными транзакциями. Вы можете работать с транзакциями XA в Java с помощью API транзакций Java (JTA) . Серверы Java EE поддерживают эту встроенную функцию. Если вы не используете сервер Java EE, вы можете использовать отдельную библиотеку, которая реализует JTA, например Нараяна или Атомикос .

Каждый метод в DAO открывает новое соединение с базой данных и закрывает его в конце метода.

Обычно это не то, как вы должны писать DAO. Открытие соединения с базой данных является относительно медленной операцией; если вы открываете новое соединение с базой данных для каждого метода, который вы вызываете в DAO, ваша программа больше всего будет работать медленно. Вы должны хотя бы использовать пул соединений, который управляет рядом соединений с базой данных и позволяет повторно использовать уже открытые соединения.

Если я использую один экземпляр базы данных, и каждый метод в DAO записывает в другую таблицу, должен ли я использовать источник данных XA? поскольку транзакция произошла на уровне сервиса, но только в одной базе данных

Если каждый из ваших методов DAO открывает свое собственное соединение, они будут выполняться в отдельных транзакциях. Является ли это проблемой или нет, зависит от того, что должно делать ваше приложение. Источник данных XA не является решением для их запуска в одной транзакции. Вместо этого вам следует разрешить им использовать одно и то же соединение и транзакцию.

Транзакции XA действительно полезны, только если вы используете несколько систем баз данных или другие системы, и вы хотите иметь возможность выполнять транзакции, которые охватывают эти системы.

...