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

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

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

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

Ответы [ 4 ]

5 голосов
/ 14 марта 2010

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

По другим проектам:

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

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

4 голосов
/ 03 июля 2010

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

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

Нитин

3 голосов
/ 12 марта 2010

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

0 голосов
/ 13 марта 2010

Может быть, посмотрите на commons -action для доступа к транзакционному файлу. См .:

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

...