Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Заранее прошу прощения за некий сумбур в формулировке вопроса - у меня в голове такой же беспорядок. :( Есть веб-служба, один из методов которой вызывается настолько часто, что я вынуждена бороться за каждую миллисекунду. Метод делает следующее: try { /* выполняет осмысленный код */ lock(this) // запись в текстовый лог-файл { FileInfo f = new FileInfo(имя файла); // имя файла содержит в себе дату и время с точностью до часа StreamWriter writer = f.AppendText(); writer.WriteLine(logline); writer.Close(); } } catch (Exception ex) { lock(this) // запись в текстовый лог-файл ошибок { FileInfo f = new FileInfo(имя файла ошибок); // имя файла ошибок содержит в себе дату и время с точностью до миллисекунд StreamWriter writer = f.AppendText(); writer.WriteLine(errorline); writer.Close(); } } Часто возникающее исключение: The process cannot access the file ... because it is being used by another process Мне надо придумать, как ускорить эту схему и по возможности минимизировать количество возникающих исключений, не теряя при этом ни записи в основной лог, ни суммарную скорость выполнения метода. Что можно сделать? Посоветуйте, пожалуйста, как решаются подобные задачи для систем, работающих с большой нагрузкой. Заранее огромное спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 09:32 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
вижу 2 варианта 1. логи не в текстовик, а в БД писать 2. использовать msmq ... В очередь писать с частотой как получается, а оттуда - по расписанию выбирать.. С уважением, Petr[@]Chulkov.NET ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 10:55 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
1. Я боюсь, при каждом вызове метода открывать соединение с БД и делать запись будет очень накладно. Или есть какой-то способ сделать это как-то по-умному? 2. msmq - это что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 10:59 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
1. можно открыть одно соединение на приложение (в web служба - просто один из варинатов приложений) и при каждом вызове просто добавлять данные.. да и всё же есть мнение, что база будет эффективнее текстового файла в данном случае.. 2.это messages queues .... см. namespace system.messaging подробнее - см. msdn2 или учебники по .net \ vb.net ps: если надо - могу поделится учебниками по этим темам в эл. виде... С уважением, Petr[@]Chulkov.NET ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 11:09 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
1. Над таким вариантом я думала, но я слишком смутно представляю его реализацию... Не поможете примером или чем-то вроде пошаговой инструкции. Где/как создать соединение. Где/как им пользоваться. Вообще чувствую, что мне не хватает базовых знаний по архитектуре веб-служб. Писать их могу, но шаг в сторону - и уже всё плохо. :( 2. Посмотрю, спасибо. Да, от учебников я бы не отказалась. :) Можете выслать их на saigo@nevatravel.ru? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 11:16 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
1. web служба, она не сама по себе живёт, а является частью WEB приложения .... соотв. в части Вашего приложения, что отрабатывает при старте пропишите sqlconnect, положите его в контекст application и оттуда вызывайте.... думаю, что должно получится а на счёт документации - лучше в приват.... адрес в подписи...С уважением, Petr[@]Chulkov.NET ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 11:34 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Щас последует сложноформулируемый ответ. Ошибки возникают от того, что веб сервер пытается обработать несколько запросов одновременно, естественно, они одновременно пытаются писать в файл. lock(this) -- вредная конструкция (ссылок давать не буду, верь на слово), а данном случае бесполезная, т.к. сервер на каждый запрос создает новый экземпляр службы. Писать сообщения об ошибках лучше всего через System.Diagnostics.Trace, он настраивается в конфигурационном файле. Писать в основной файл нужно с использованием блокировок, доступных всем экземплярам службы. Например, можно создать статический класс MyWriter с методом WriteLog(<лог>). Программирую за еду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 11:37 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
PChulkov: вижу 2 варианта 1. логи не в текстовик, а в БД писать 2. использовать msmq ... В очередь писать с частотой как получается, а оттуда - по расписанию выбирать.. это только замедлит. Evgenia, заведи глобальную переменную с типом Queue>string и 1) открыть поток - цикл( залочить - Dequeue()-отлочить - записать в поток) закрыть поток. 2) открыть поток - залочить цикл( Dequeue()- записать в поток) -отлочить закрыть поток. От хаоса в космос и далее к наличным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 11:42 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
>Писать сообщения об ошибках лучше всего через System.Diagnostics.Trace Посмотрю этот класс, спасибо. >создать статический класс MyWriter А где он должен быть создан? В Global.asax.cs? В Application_Start? Или где-то в другом месте? И как обращаться к этому классу из тела метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 12:07 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
EvgeniaДа, от учебников я бы не отказалась. :) ----- The following addresses had permanent fatal errors ----- <saigo@nevatravel.ru> (reason: 554 5.7.1 Command rejected) ----- Transcript of session follows ----- ... while talking to mail.nevatravel.ru.: >>> DATA <<< 554 5.7.1 Command rejected 554 5.0.0 Service unavailable проверьте работу своего почтового сервера... отправлял с 2-х адресов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 12:08 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
>глобальную переменную с типом Queuestring А где её заводить? Вот это-то я и не понимаю... >В отдельном потоке, по расписанию А это где делать? Ясно, что не в методе. А где? Прошу прощения за глупые вопросы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 12:10 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Странно... Тогда, может, на saigo@yandex.ru? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 12:11 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Evgenia: >Писать сообщения об ошибках лучше всего через System.Diagnostics.Trace Посмотрю этот класс, спасибо. >создать статический класс MyWriter А где он должен быть создан? В Global.asax.cs? В Application_Start? Или где-то в другом месте? И как обращаться к этому классу из тела метода? Да в вашем вебсервисе и сделайте статическую переменную. P. S. Писать лог нужно все же в файл, этот способ много быстрее и легче чем БД или еще что либо.Все должно быть просто, очень просто, настолько просто - насколько это возможно! Мой блог Возможно на твой вопрос уже есть ответ? FAQ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 12:14 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
>создать статический класс MyWriter А где он должен быть создан? В Global.asax.cs? В Application_Start? Или где-то в другом месте? И как обращаться к этому классу из тела метода? под "создать статический класс" я имел ввиду вязть клавиатуру и написать: public static class MyWriter { public static WriteLine(string log) { lock (SyncRoot) { <запись в файл> } } private static readonly object SyncRoot = new object(); } статические методы вызываются на классе, а не на экземпляре, т.е. чтобы вызвать WriteLine экземпляр создавать не нужно ( пишем MyLogger.WriteLine("Привет, ромашки!"); ). Статический класс один на всех как минимум в домене приложения (т.е. все экзепляры твоей службы будут синхронизировать запись в файл через него). Программирую за еду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 12:42 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Создать класс в котором эта переменная будет пропертей светить наружу или сделать метод для добавления в эту очередь, в этом же классе в конструкторе организовать отдельный поток в котором будет идти запись в файл. Главное не ошибиться с локами. - Создавать этот класс можно в Application_Start и хранить в Application. В Application_End диспоузить этот клас, в диспоузе дописывать остатки из очереди, диспоузить файл/stream, делать выход из "отдельного" tread. - З.Ы. про Trace - не заморачивайся пока, он служит для логгирования работы текущего приложения. Рекомендую каждый инструмент использовать по назначению. И еще по поводу Trace, его лучше использовать через Enterprise Library. И еще, лучше, имхо, использовать Log4net вместо EL/Trace. От хаоса в космос и далее к наличным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 12:43 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Осмелюсь порекомендовать http://www.gotdotnet.ru/Downloads/Examples/337559.aspxЛицензионный пользователь нелицензионного ПО ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 13:51 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
для каждой записи создавать отдельный файл. делов-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2006, 14:18 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Было бы интересно узнать какое решение было в итоге выбрано. От хаоса в космос и далее к наличным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2006, 21:24 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
>Было бы интересно узнать какое решение было в итоге выбрано. Пока экспериментирую с предложенными. Когда остановлюсь на каком-то варианте, обязательно напишу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2006, 11:52 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Evgenia1. Я боюсь, при каждом вызове метода открывать соединение с БД и делать запись будет очень накладно. Или есть какой-то способ сделать это как-то по-умному? а connection pool'ы никто не использует что-ли из участвующих в этом топике? очень странно, что никто про это не говорит. очень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2006, 14:12 |
|
||
|
сложноформулируемый вопрос
|
|||
|---|---|---|---|
|
#18+
Evgenia1. Я боюсь, при каждом вызове метода открывать соединение с БД и делать запись будет очень накладно. Или есть какой-то способ сделать это как-то по-умному? а connection pool'ы никто не использует что-ли из участвующих в этом топике? очень странно, что никто про это не говорит. очень. Про connection pool'ы раздувают в соседнем топике. Честно говоря, все эти тёрки на счет "когда закрывать соединение?" меня порядком задрали, и очень хорошо, что хотя-бы здесь это не обсуждают. Программирую за еду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2006, 15:39 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=34146831&tid=1387188]: |
0ms |
get settings: |
9ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 396ms |

| 0 / 0 |
