Я храню атрибуты файла (размер, обновляю время …) в базе данных. Таким образом, проблема состоит в том, как справиться с транзакцией для базы данных и файла.
В Java среда EE JTA просто может справиться с транзакцией базы данных. В случае, если, обновляя базу данных успешно, но операционные сбои файла, я должен записать метод отката файлов для этого? Кроме того, операция файла в контейнере EJB нарушает спецификацию EJB.
Каково Ваше мнение?
Доступ к внешним ресурсам, таким как файловая система, в идеале должен осуществляться через соединитель JCA . Хотя вокруг этого обсуждается несколько сообщений, я так и не нашел готового к использованию соединителя JCA для транзакционного доступа к файловой системе, поэтому я начал писать его:
Что касается других проектов:
Обратите внимание, что если у вас более одного транзакционного участника, приложение. серверу действительно нужно использовать распределенную транзакцию, и все становится сложнее. Вы не должны недооценивать эту сложность (например, в базе данных есть другой механизм тайм-аута для распределенной транзакции).
Другой упрощенный подход, который следует рассмотреть, - использовать SFSB , который записывает в файловую систему. Если вы реализуете интерфейс SessionSynchronization
, вы получите обратные вызовы beforeCompletion
и afterCompletion
. Последний указывает, была ли транзакция зафиксирована или отменена, и при необходимости вы выполняете очистку. Затем вы можете реализовать транзакционное поведение.
JTA не просто для баз данных, его можно долго использовать с любым другим ресурсом, если этот ресурс поддерживает транзакцию XA. Например, XADisk позволяет одну такую интеграцию файловых систем с транзакциями XA. Следовательно, он также может решить проблему согласованности файловой системы и базы данных, которую вы пытались решить.
Надеюсь, что это поможет.
Нитин
вручную. Для этого вам, вероятно, потребуется написать компенсационные транзакции.
Возможно, посмотрите на commons-transaction для транзакционного доступа к файлам. См.:
В любом случае, вам придется писать файлы вне контейнера EJB или взаимодействовать с JCA-коннектором, как указал @ewernli.