Я хотел бы знать, как я могу получить доступ к файловой системе из bean-компонента EJB 3?
Я искал в Интернете по этому вопросу и не нашел хорошего ответа.
Некоторые предлагают использовать java.io/java.nio, хотя спецификация запрещает такое использование. Большинство серверов приложений в любом случае разрешают доступ к этому API.
Другой идеей было бы использовать коннектор JCA для доступа к файловой системе или каталогу LDAP.
Что я хочу сделать, чтобы избежать использования BLOB в базе данных, когда простой файл был бы гораздо лучшим решением с точки зрения производительности и используемых ресурсов.
Как бы вы решили эту проблему?
Вам не нужно иметь BLOB в базе данных. SQL Server 2008 поддерживает хранилище файлового потока, которое, по сути, выгружает файл в папку на сервере БД, но предоставляет доступ к нему через базу данных. блоги. msdn.com/rdoherty/archive/2007/10/12/ pjp 31.08.2009
Причина, по которой вам запрещен доступ к файловой системе в 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();
В качестве альтернативы вы можете использовать java.beansпостоянный XML (т. е. XMLDecoder, XMLEncoder) для кодирования экземпляра в виде строки XML и сохранения его в JNDI.
Ответ 2 · рейтинг 9 · flybywire
Если вы знаете, что никогда не будете кластеризовать свое приложение (или что вы сможете подключить диск к сети), просто используйте java.io.*.
Обязательно введите правильную конфигурацию в отношении корневого расположения вашего хранилища файлов.
Ответ 3 · рейтинг 5 · Conor
Инкапсулируйте свой доступ к данным файла. Затем вы можете использовать любой из методов, описанных выше. Даже использовать базу данных. Измерьте производительность вашей системы. Если он соответствует требованиям, то все готово. Если нет, доступ к вашему файлу локализован в одном месте, и вы можете заменить его другим решением. То же преимущество, если программное обеспечение должно быть перенесено в другой контейнер и/или должно поддерживаться кем-то другим.
Ответ 4 · рейтинг 1 · Vineet Reynolds
Обычный доступ к файлам не является транзакционным по своей природе. Если вы не встроите поддержку транзакционных операций (я понятия не имею, как это сделать - это работа менеджера ресурсов), вам придется беспокоиться о транзакционной семантике выполняемой вами операции. Если вы встроите поддержку транзакций, вы получите очень мало производительности (некоторая потеря производительности в базах данных связана со всей бухгалтерией, выполняемой менеджером ресурсов). И не забывайте о близком родственнике управления транзакциями - параллелизме. Если вы не начнете писать в новый файл для каждого запроса, проблемы параллелизма будут более или менее кусать вас.
Если вы не находитесь в чистоте с хорошим техническим обоснованием, вам не следует пытаться получить доступ к файловой системе из EJB. Очень хорошим примером может быть фреймворк ведения журнала (а не аудита) - доступ к файловой системе для записи файлов журнала наносит относительно меньший вред, учитывая, что ведение журнала не обязательно должно быть операцией транзакции, т. е. вам не нужно откатывать записи в журнальный файл; не то, чтобы было приемлемо иметь частичную запись.