powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / сложноформулируемый вопрос
21 сообщений из 21, страница 1 из 1
сложноформулируемый вопрос
    #34145636
Evgenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заранее прошу прощения за некий сумбур в формулировке вопроса - у меня в голове такой же беспорядок. :(

Есть веб-служба, один из методов которой вызывается настолько часто, что я вынуждена бороться за каждую миллисекунду.

Метод делает следующее:
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

Мне надо придумать, как ускорить эту схему и по возможности минимизировать количество возникающих исключений, не теряя при этом ни записи в основной лог, ни суммарную скорость выполнения метода.

Что можно сделать?
Посоветуйте, пожалуйста, как решаются подобные задачи для систем, работающих с большой нагрузкой.
Заранее огромное спасибо за помощь.
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34145922
PChulkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вижу 2 варианта
1. логи не в текстовик, а в БД писать
2. использовать msmq ... В очередь писать с частотой как получается, а оттуда - по расписанию выбирать..
С уважением, 
Petr[@]Chulkov.NET
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34145936
Evgenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Я боюсь, при каждом вызове метода открывать соединение с БД и делать запись будет очень накладно. Или есть какой-то способ сделать это как-то по-умному?
2. msmq - это что?
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34145981
PChulkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.  можно открыть одно соединение на приложение  (в web служба - просто один из варинатов приложений) и при каждом вызове просто добавлять данные..
 да и всё же есть мнение, что база будет эффективнее текстового файла в данном случае..

2.это messages queues ....
см. namespace system.messaging
подробнее - см. msdn2 или учебники по  .net  \ vb.net 

ps: если надо - могу поделится учебниками по этим темам в эл. виде...
С уважением, 
Petr[@]Chulkov.NET
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146016
Evgenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Над таким вариантом я думала, но я слишком смутно представляю его реализацию... Не поможете примером или чем-то вроде пошаговой инструкции. Где/как создать соединение. Где/как им пользоваться.

Вообще чувствую, что мне не хватает базовых знаний по архитектуре веб-служб. Писать их могу, но шаг в сторону - и уже всё плохо. :(

2. Посмотрю, спасибо.

Да, от учебников я бы не отказалась. :)
Можете выслать их на saigo@nevatravel.ru?
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146096
PChulkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. web служба, она не сама по себе живёт, а является частью  WEB приложения .... соотв. в части Вашего приложения, что отрабатывает при старте пропишите sqlconnect, положите его в контекст application и оттуда вызывайте.... думаю, что должно получится

а на счёт документации - лучше в приват....
адрес в подписи...С уважением, 
Petr[@]Chulkov.NET
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146106
Начинающий программист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щас последует сложноформулируемый ответ.

Ошибки возникают от того, что веб сервер пытается обработать несколько запросов одновременно, естественно, они одновременно пытаются писать в файл.

lock(this) -- вредная конструкция (ссылок давать не буду, верь на слово), а данном случае бесполезная, т.к. сервер на каждый запрос создает новый экземпляр службы.

Писать сообщения об ошибках лучше всего через System.Diagnostics.Trace, он настраивается в конфигурационном файле.

Писать в основной файл нужно с использованием блокировок, доступных всем экземплярам службы. Например, можно создать статический класс MyWriter с методом WriteLog(<лог>).
Программирую за еду.
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146128
bazaea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PChulkov:
вижу 2 варианта
1. логи не в текстовик, а в БД писать
2. использовать msmq ... В очередь писать с частотой как получается, а оттуда - по расписанию выбирать..


это только замедлит.
Evgenia, заведи глобальную переменную с типом Queue>string и 1) открыть поток - цикл( залочить - Dequeue()-отлочить - записать в поток) закрыть поток.
2) открыть поток - залочить цикл( Dequeue()- записать в поток) -отлочить закрыть поток.
От хаоса в космос и далее к наличным
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146246
Evgenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Писать сообщения об ошибках лучше всего через System.Diagnostics.Trace

Посмотрю этот класс, спасибо.

>создать статический класс MyWriter

А где он должен быть создан? В Global.asax.cs? В Application_Start? Или где-то в другом месте? И как обращаться к этому классу из тела метода?
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146252
Petr Chulkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-х адресов...
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146263
Evgenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>глобальную переменную с типом Queuestring

А где её заводить? Вот это-то я и не понимаю...

>В отдельном потоке, по расписанию

А это где делать? Ясно, что не в методе. А где?

Прошу прощения за глупые вопросы...
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146274
Evgenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно... Тогда, может, на saigo@yandex.ru?
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146290
Evgenia:

>Писать сообщения об ошибках лучше всего через System.Diagnostics.Trace

Посмотрю этот класс, спасибо.

>создать статический класс MyWriter

А где он должен быть создан? В Global.asax.cs? В Application_Start? Или где-то в другом месте? И как обращаться к этому классу из тела метода?
Да в вашем вебсервисе и сделайте статическую переменную.
 
P. S. Писать лог нужно все же в файл, этот способ много быстрее и легче чем БД или еще что либо.Все должно быть просто, очень просто, настолько просто - насколько это возможно!
 Мой блог Возможно на твой вопрос уже есть ответ? FAQ
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146416
Начинающий программист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>создать статический класс 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("Привет, ромашки!"); ). Статический класс один на всех как минимум в домене приложения (т.е. все экзепляры твоей службы будут синхронизировать запись в файл через него).
Программирую за еду.
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146427
bazaea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создать класс в котором эта переменная будет пропертей светить наружу или сделать метод для добавления в эту очередь, в этом же классе в конструкторе организовать отдельный поток в котором будет идти запись в файл. Главное не ошибиться с локами.
-
Создавать этот класс можно в Application_Start и хранить в Application. В Application_End диспоузить этот клас, в диспоузе дописывать остатки из очереди, диспоузить файл/stream, делать выход из "отдельного" tread.
-
З.Ы. про Trace - не заморачивайся пока, он служит для логгирования работы текущего приложения. Рекомендую каждый инструмент использовать по назначению. И еще по поводу Trace, его лучше использовать через Enterprise Library. И еще, лучше, имхо, использовать Log4net вместо EL/Trace. От хаоса в космос и далее к наличным
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146706
dio30
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Осмелюсь порекомендовать
http://www.gotdotnet.ru/Downloads/Examples/337559.aspxЛицензионный пользователь нелицензионного ПО
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34146831
/
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
/
Гость
для каждой записи создавать отдельный файл. делов-то.
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34155582
bazaea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было бы интересно узнать какое решение было в итоге выбрано. От хаоса в космос и далее к наличным
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34160189
Evgenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Было бы интересно узнать какое решение было в итоге выбрано.

Пока экспериментирую с предложенными.
Когда остановлюсь на каком-то варианте, обязательно напишу.
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34160853
Evgenia1. Я боюсь, при каждом вызове метода открывать соединение с БД и делать запись будет очень накладно. Или есть какой-то способ сделать это как-то по-умному?
а connection pool'ы никто не использует что-ли из участвующих в этом топике? очень странно, что никто про это не говорит. очень.
...
Рейтинг: 0 / 0
сложноформулируемый вопрос
    #34161196
Начинающий программист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Evgenia1. Я боюсь, при каждом вызове метода открывать соединение с БД и делать запись будет очень накладно. Или есть какой-то способ сделать это как-то по-умному?
а connection pool'ы никто не использует что-ли из участвующих в этом топике? очень странно, что никто про это не говорит. очень.

Про connection pool'ы раздувают в соседнем топике. Честно говоря, все эти тёрки на счет "когда закрывать соединение?" меня порядком задрали, и очень хорошо, что хотя-бы здесь это не обсуждают.
Программирую за еду.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / сложноформулируемый вопрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]