| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Как поставить блокировку на файл при записи xml? |
| Автор: x4444 5.4.2006, 19:46 | ||
| серверная часть программы (сервлет) должна сохранять данные, которые ввел пользователь в xml файл. условия такие, что одновременно на Tomcat могут быть запущены несколько Applications (однотипных), пишущих в один xml файл. http://server/app1/servlet1 http://server/app2/servlet1 . . . сейчас я пишу мотдом Transformer.transform(Sourse, Result)
т.е. никаких блокировок не ставлю Совсем неуверен, что так оно будет безопасно. Как правильно безопасно записать XML в файл? |
| Автор: LSD 5.4.2006, 22:27 |
| Э-э-э, ну как бы тебе объяснить... Сделать потокобезопасный OutputStream, это не сложно, но это не гарантирует, что там будет корректный XML. Наверно надо в твоем приложении делать синхронизацию, как только приложение хочет записать данные, оно захватывает блокировку, пишет их, а потом снимает ее. |
| Автор: x4444 6.4.2006, 12:28 | ||
Сейчас я сделал свой синхронизированный метод addToXML() (в классе обрабатывающего сервлета) который делает следующее 1. parse XML файл в документ 2. добавляет новые ноды в документ 3. трансформирует документ в XML файл Т.о. в рамках одного application (ввиду того, что обрабатывающий сервлет только один) стало безопасно. Но апликейшенов несколько, а файл один. Поэтому вполне возможно, что один application начал parse в то время как второй уже добавил ноды, но еще не записал. Поэтому мне надо чтобы при начале выполнения метода addToXML на файл накладывался запрет на чтение и запись. т.е. мне нужно монопольно юзать файл. Т.е. это на уровне ОС должно происходить. Рекомендуют смотреть в сторону java.nio.channels.FileLock, java.nio.channels.FileChannel , там есть методы lock(), tryLock() Но как конкретно сделать еще не понял, FileChannel можно получить из FileOutputStream методом getChannel(), и получив FileChannel можно попытаться наложить замок на файл ( tryLock() ). Однако как подсунуть FileChannel трансформеру XML . У классов ветки Result (e.g. StreamResult) нет конструктора c параметром FileChannel. |
| Автор: LSD 6.4.2006, 21:57 | ||
А зачем тебе передавать Transformer-ру FileChannel? Передавай ему FileOutputStream.
|
| Автор: x4444 16.4.2006, 17:14 |
| я вот думаю в каком порядке делать снятие замка и закрытие стрима и канала вроде как сначала закрыть стрим потом сянять замок и закрыть канал правильно? |
| Автор: LSD 16.4.2006, 20:04 | ||
| Закрытие канала снимает блокировку, поэтому - вначале ставишь блокировку (shared - на чтение, exclusive - на запись), затем пишешь/читаешь данные, если писал выполняешь flush(), снимаешь блокировку, закрываешь поток. Только учти одну вещь:
Под Windows во всяком случае, все нормально работает, за другие ОС не скажу. |
| Автор: x4444 16.4.2006, 23:36 | ||
| Непонятно почему, но не поучается наложить замок на FileInputStream. получаю Exception: null
тот же самый код но с FileOutputStream работает нормально |
| Автор: firedrago 17.4.2006, 01:53 |
| а не проще ли создавать пустой лок файл все остальные спят пока myLockFile.exists().... как только лок файл удален - начинает работу следующий.... ....я бы так сделал....наверное..... |
| Автор: Ortega 17.4.2006, 10:54 | ||
под Linux тоже работает, во всяком случае, exclusive |