Как управлять транзакцией для базы данных и файловой системы в среде Java EE?

Я храню атрибуты файлов (размер, время обновления...) в базе данных. Поэтому проблема заключается в том, как управлять транзакцией для базы данных и файла.

В среде Java EE JTA может управлять транзакцией базы данных. В случае, если обновление базы данных будет успешным, но операция с файлом завершится неудачно, должен ли я писать метод отката файлов для этого? Более того, работа с файлами в контейнере EJB нарушает спецификацию EJB.

Каково ваше мнение?

Ответ 1

Доступ к внешним ресурсам, таким как файловая система, должен идеально проходить через JCA-коннектор. Хотя есть несколько сообщений, обсуждающих это, я никогда не нашел готового к использованию JCA-коннектора для транзакционного доступа к файловой системе, поэтому начал писать один:

Относительно других проектов:

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

Другим легким подходом к рассмотрению является использование SFSB, который записывает в файловую систему. Если вы реализуете интерфейс SessionSynchronization, вы получаете обратные вызовы beforeCompletion и afterCompletion. Позже указывается, была ли транзакция выполнена или откат, и при необходимости очистка. Затем вы можете реализовать транзакционное поведение.

Ответ 2

JTA не просто для баз данных, он может использоваться долго с любым другим ресурсом, если этот ресурс поддерживает транзакцию XA. Например, XADisk позволяет такую ​​интеграцию файловых систем с транзакциями XA. Следовательно, он также может решить проблему согласования файловой системы и базы данных, которую вы пытаетесь решить.

Надеюсь, что это поможет.

Нитин

Ответ 3

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

Ответ 4

Возможно, посмотрите на commons-transaction для доступа к транзакционным файлам. См. Также:

В любом случае вам придется записывать файлы вне контейнера EJB или взаимодействовать с разъемом JCA, как указано в @ewernli.