LINUX.ORG.RU

Потокобезопасностый IO в Spring


0

0

Здравствуйте! Пишу веб-приложение на Spring. В том числе храню выгружаемые фалы в файловой системе. Делаю это примерно так:

int newId = fileDescDao.create(fileName, fileType....);
String path = BASE_DIR + newId + "/";
(new File(path)).mkdir;
FileOutputStream fos = new FileOutputStream(path + fileName);
IOUtil.copy(is, fos)
is.close();
fos.close();
//is - собственно выгружаемый файл.

Получается, что в БД уже существует запись, ссылающаяся на файл, а файл может быть еще не записан на диск, поэтому при попытке чтения файла может возникнуть ошибка. Более того это простой пример, есть места где запросов к БД выполняется больше. Будет ли достаточно транзакций (TransactionTemplate)?. Тогда вопрос - какая область действия их, т.е. если я напишу внутри транзакции fileDescDao.create(fileName, fileType....), то то что внутри create будет в транзакции или нет? Подскажите как это грамотно делается.

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

★★★★★

Есть специальные, да. Что-то вроде хранилища, только это в Django ^_^

phasma ★☆
()

если update атомарно выполняется, то можно например вести какую-то таблицу работ записи файлов
в таблице будет поле что-то типа opcode
по умолчанию 0 - не обработан
1 - записывается на диск
2 - записан

типа наколеночная синхронизация

dimon555 ★★★★★
()
Ответ на: комментарий от roy

>А нельзя сперва создать файл, а потом уже обновлять БД?

А как я его потом получу? При получении выбирается ID, а по нему файл. Соответственно при сохранении вначале создаться запись в БД, чтобы получить ID и сохранить его.

dizza ★★★★★
() автор топика

При уровне изоляции READ COMMITABLE, пока ты не закоммитишь транзакцию, запись не будет видна из других транзакций. Поэтому если коммитить транзакцию после fos.close(), то проблемы быть не должно.

Если же при коммите возникнет исключение, то нужно будет вручную откатывать (удалять) файл. Впрочем, это не обязательно, т.к если генерируемые id не откатываются, то просто получится ничейный файл, зря занимающий место.

WFrag ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.