Подтвердить что ты не робот

Как получить доступ к файловой системе из EJB 3?

Я хотел бы знать, как я могу получить доступ к файловой системе из EJB 3 bean?

Я искал Интернет по этому вопросу и не нашел хорошего ответа.

Некоторые предлагают использовать java.io/java.nio, хотя спецификация запрещает это использование. Похоже, что большинство серверов приложений разрешают доступ к этому API.

Еще одна идея - использовать JCA-коннектор для доступа к файловой системе или каталогу LDAP.

Что я хочу сделать, чтобы избежать использования BLOB в базе данных, когда простой файл будет гораздо лучшим решением с точки зрения производительности и используемых ресурсов.

Как бы вы решили эту проблему?

4b9b3361

Ответ 1

Причина, по которой вы отказались от доступа к файловой системе в EJB, заключается в том, что вы не можете контролировать, как ваше приложение запускается в контейнере (Java EE). Например, ваше приложение может запускаться через кластер серверов, и в этом случае сохранение некоторого объекта в каталоге на одном сервере, вероятно, малопригодно. (Конечно, у вас может быть сетевая файловая система, поэтому ограничение может не применяться).

Одним из вариантов может быть использовать реализацию JNDI, которая поставляется вместе с вашим контейнером. Вероятно, вы сможете сохранить исходный массив byte[] в каком-то месте JNDI, поэтому вы всегда можете сэкономить сериализованную форму объекта:

ByteArrayOutputStream baos= new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(myObj);

//Now save into JNDI
new InitialContext().bind("path/to/myobject", baos.toByteArray());

Это может быть просмотрено позже и повторно преобразовано в ваш объект:

byte[] bs = (byte[]) new InitialContext().lookup("path/to/myobject");
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bs));
MyObj myObj = (MyObj) ois.readObject();

В качестве альтернативы вы можете использовать постоянный XML java.beans (т.е. XMLDecoder, XMLEncoder) для кодирования вашего экземпляра в виде XML-строки и сохранения в JNDI.

Ответ 2

Если вы знаете, никогда не будет группироваться приложение (или, что вы будете в состоянии сети, подключить диск), то просто используйте java.io. *.

Обязательно укажите правильную конфигурацию корневого расположения хранилища файлов.

Ответ 3

Инкапсулируйте свой доступ к файлам. Затем вы можете использовать любой из описанных выше методов. Даже используйте базу данных. Измерьте производительность вашей системы. Если он соответствует требованиям, тогда вы закончите. Если ваш доступ к файлам не локализуется в одном месте, вы можете заменить другое решение. Такая же польза, если программное обеспечение должно быть перенесено в другой контейнер и/или должно поддерживаться кем-то другим.

Ответ 4

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

В разделе "Часто задаваемые вопросы по Blue Blueprint" вы найдете гораздо больше информации об ограничениях EJB.

Если вы не поняли с хорошим техническим обоснованием, вам не следует пытаться получить доступ к файловой системе из EJB. Хорошим примером может служить структура ведения журнала (а не аудит) - относительно меньше вреда при доступе к файловой системе записывать файлы журналов, учитывая, что ведение журнала не должно быть транзакционной операцией, т.е. Вам не нужно откатывать записи в журнальный файл; не то, что допустимо иметь частичную запись.