|
записьтекста, немонопольный доступ | ☑ | ||
---|---|---|---|---|
0
novichok79
04.10.18
✎
15:18
|
доброго времени суток, уважаемые специалисты.
есть самописная база, в ней реализована запись лога в текстовые файлы в одном модуле. текстовые файлы на момент записи открываются на монопольный доступ. в момент выполнения фоновых заданий, они пишут в один файл одновременно, в итоге получается ошибка выполнения. можно ли как-то открыть файл на запись немонопольно? через текстовый файл кажется можно, но он медленнее и придется читать каждый раз весь лог, а не хотелось бы этого. заранее благодарю за ответы. |
|||
1
Cyberhawk
04.10.18
✎
15:18
|
Что-то ты мудришь
|
|||
2
Cyberhawk
04.10.18
✎
15:19
|
Пусть сеанс пишет в отдельный файл. Потом склеивай
|
|||
3
novichok79
04.10.18
✎
15:19
|
(1) в смысле?
|
|||
4
novichok79
04.10.18
✎
15:20
|
(2) так и делается, но бывают пересечения. че кроме обертки в попытку нет никаких вариантов?
|
|||
5
Cyberhawk
04.10.18
✎
15:20
|
Какие еще пересечения? Файл каждый раз уникальный должен быть
|
|||
6
youalex
04.10.18
✎
15:27
|
(2) +1
(0) >>через текстовый файл кажется можно ну да, и будет такое: сеанс1 прочитал;сеанс2 прочитал; сеанс1 записал; сеанс 2 записал /затер изменения сеанса1 |
|||
7
Cool_Profi
04.10.18
✎
15:29
|
нет. Текстовый документ он не многопоточный.
Пиши в базу данных |
|||
8
novichok79
04.10.18
✎
15:50
|
(7) ясно, спасибо.
|
|||
9
Лефмихалыч
04.10.18
✎
16:12
|
ЗаписьЖурналаРегистрации() решит этот вопрос
|
|||
10
d4rkmesa
04.10.18
✎
16:14
|
(0) Можно попробовать с NoSQL подружить. К примеру, как здесь:
http://catalog.mista.ru/public/642927/ |
|||
11
DmitrO
04.10.18
✎
17:19
|
Можно писать и в один файл, просто процедуры записи нужно синхронизировать между разными фоновыми заданиями.
Вообще, традиционно, это делается при помощи специальных функций файловой системы, но они в 1С не доступны. Однако у нас задача только синхронизировать. Писать в один файл разными потоками выполнения можно синхронизировав их например блокировками сервера 1С. Процедура ЗаписатьВЛог(ИмяФайла, ТекстСообщения) НачатьТранзакцию(); Блокировка = Новый БлокировкаДанных; Блокировка.Добавить("Справочник.Любой"); Блокировка.Заблокировать(); //Все, в этом месте может выполняться всегда только один поток, остальные ждут, поэтому спокойно открываем файл (1С это делает монопольно) и пишем ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла); ЗаписьТекста.ЗаписатьСтроку(ТекстСообщения); ЗаписьТекста.Закрыть(); ЗафиксироватьТранзакцию(); КонецПроцедуры Ставим блокировку на любой объект, лучше на тот, который меньше всего редактруется, можно и на элемент поставить, это не важно. Более того можно даже на пустую ссылку или на не существующий элемент поставить. Это похоже на технику синхронизации критической секцией. |
|||
12
Лефмихалыч
04.10.18
✎
17:20
|
охренеть
|
|||
13
youalex
04.10.18
✎
17:46
|
Еще можно написать сервис, в сторону которого сеансы 1С будут выплевывать сообщения, а он эти сообщения будет синхронизировать и писать на диск.
В один файл. |
|||
14
d4rkmesa
04.10.18
✎
20:01
|
(11) Ога, мьютексы и семафоры в 1С. =)
|
|||
15
sechs
04.10.18
✎
20:07
|
(13) Еще немного, и ты изобретешь syslogd
|
|||
16
Сияющий в темноте
04.10.18
✎
21:24
|
Самое простое и часто используемое,если нельзя создать файл,то через черточку добавляем к его имени цифру и увеличиваем ее на единицу,пока файл не создастся.
Потом,если очень нужно,можно файлы склеить,но лучше,чтобы всегда в один файл писал один процесс,тогда проще с ошибками разбираться. |
|||
17
Franchiser
гуру
05.10.18
✎
00:00
|
Я делал через попытку с ожиданием
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |