Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Работа с socket-ами и sql в одном приложении=многопоточность?   Найти похожие ветки 

 
Сергей Ю   (2006-12-11 09:29) [0]

Господа мастера поясните мне технологию решения моей проблемы:
есть приложение обменивающееся с клиентами по сокетам некоторой информацией и производящее запись/чтение в базу данных. Проблема в том что когда идет выборка информации из БД (или запись) идет она довольно долго и в этот момент ряд клиентов может "отпасть" от приложения. Но "видимо оно еще об этом не знает" и производит попытку отправить клиенту данные. В результате имеем exception. Видимо необходимо переработать саму структуру приложения. Почитал что вроде мне должна помочь многопоточность. В эту ли сторону мне копать?


 
Сергей М. ©   (2006-12-11 09:41) [1]


> в этот момент ряд клиентов может "отпасть" от приложения


"Отпасть" - это как ?


> В результате имеем exception


Исключения вообще-то принято обрабатывать, причем грамотно.


> необходимо переработать саму структуру приложения


И это очевидно.


> мне должна помочь многопоточность. В эту ли сторону мне
> копать?


Вовсе не обязательно, хотя и возможно.
Это зависит от конкретного протокола инф.обмена между сервером и клиентами и от сквозной логики приложения-сервера.


 
Сергей Ю   (2006-12-11 12:08) [2]

>"Отпасть" - это как ?
"отпасть" - компьтер клиента перезагрузился/выключился. его сокет "не сказал" серверу что произойдет отключение.

>Исключения вообще-то принято обрабатывать, причем грамотно.
Там где идет отсылка данных клиенту происходит обработка исключения, но ошибка возникает в модуле работы с сокетами, а он откомпилирован и соответственно внести туда обработку ошибок возможности нет.

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


 
Сергей М. ©   (2006-12-11 12:16) [3]


> необходимо разделить на две составляющих которые бы независимо
> друг от друга работали, т.е. одна часть занималась работой
> с клиентами, другая с sql.


Совершенно верно.
Но с потоками это напрямую никак не связано.


> "отпасть" - компьтер клиента перезагрузился/выключился


Это может произойти в любой момент и временная длительность упомянутой выборки из БД никак с этим не связана.


> Там где идет отсылка данных клиенту происходит обработка
> исключения, но ошибка возникает в модуле работы с сокетами,
>  а он откомпилирован и соответственно внести туда обработку
> ошибок возможности нет.
>


Проиллюстрируй вышесказанное в коде ...


 
Сергей Ю   (2006-12-11 13:42) [4]

>Совершенно верно.
Но с потоками это напрямую никак не связано.
Тогда какие еще могут быть варианты?

>Это может произойти в любой момент и временная длительность упомянутой выборки из БД никак с этим не связана.
Правильно. Но если выборка идет долго то вероятность такой ошибки значительно возрастает.


> Проиллюстрируй вышесказанное в коде ...

procedure SendText;
Var
j: Integer;
begin
with MainForm do
begin
 try
  Computers[i].Connection.SendText(sendingtext);
  //после этого и вылазит эксепшн если комп уже вырубился
 except
  ShowErrMessage(Computers[i].Address,"Ошибка связи при отправлении комманды");
 end;
end;
end;

Есть еще ньюансы в работе программы. В частности производится слежение за работой клиентов, чтоб от них всегда была информация и если в течении n-ого времени ответа от них нет то выводится сообщение об ошибке, НО: опять-же при большом времени выборки (>этого времени) происходит ситуация что ВСЕ машины не отозвались вовремя :(


 
Сергей М. ©   (2006-12-11 13:52) [5]


> какие еще могут быть варианты?


Я не про "варианты".

Я про блоки функционально законченной автономной логики - логика работы с СУБД и логика взаимодействия с удаленными клиентами.

А уж в каких потоках работает та или иная логика - это другой вопрос.


> если выборка идет долго то вероятность такой ошибки значительно
> возрастает.


Не согласен.


>  try
>   Computers[i].Connection.SendText(sendingtext);
>   //после этого и вылазит эксепшн если комп уже вырубился
>  except
>   ShowErrMessage(Computers[i].Address,"Ошибка связи при
> отправлении комманды");
>  end;


И что тебя здесь смущает ?

Все здесь правильно : SendText() вызвал исключение, оно тобой перехвачено и   в обработчике перхвата ты показал окно с сообщением об отказе.

Что тут не так ? Комментируй ...


 
Сергей Ю   (2006-12-11 14:12) [6]


> Я не про "варианты".
> Я про блоки функционально законченной автономной логики
> - логика работы с СУБД и логика взаимодействия с удаленными
> клиентами.
> А уж в каких потоках работает та или иная логика - это другой
> вопрос.

Вот мне и непонятно как можно в рамках одной программы дать возможность одновременно выполнять работу сокетам и работать с бд.


> Не согласен.

статистика работы программы показывает что чем >время на запрос, тем > ошибок (для этого в настоящий момент регулярно "чистим" базу)


> И что тебя здесь смущает ?
>
> Все здесь правильно : SendText() вызвал исключение, оно
> тобой перехвачено и   в обработчике перхвата ты показал
> окно с сообщением об отказе.
>
> Что тут не так ? Комментируй ...

Смущает что я не отловил этот эксепшн. Что в программе все равно вылазит окно с экспепшном :(


 
Сергей М. ©   (2006-12-11 14:20) [7]


> как можно в рамках одной программы дать возможность одновременно
> выполнять работу сокетам и работать с бд.


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

И то и другое напрямую зависит от выбора СУБД и выбора сокенных компонентов.


> в программе все равно вылазит окно с экспепшном


С каким конкретно ?
Что за компонент используешь ? В каком режиме ?


 
Сергей Ю   (2006-12-11 14:31) [8]

Что-то начинает проявляться в моей голове :)
СУБД - mySQL (версия не знаю какая, т.к. стоит на на моем сервере, хотя если это принципиально то могу и узнать:) )
Подключение идет через ODBC+ADO.
Обмен с клиентами организован через стандартные TServerSocket/TClientSocket типа: stNonBlocking (если честно то к своему стыду не представляю что это значит, но оно так работает :))


 
Сергей Ю   (2006-12-12 09:23) [9]

Т.е. если я правильно понимаю то компоненты "сами должны разделить" приложение на подзадачи. Главное их правильно использовать. Т.е. если у меня 100 клиентов то по идее СерверСокет должен сам создавать 100 потоков и их независимо обрабатывать? Соответственно компоненты АДО должны "себе" создать отдельный поток для работы с данными? Т.е. "все придумано до нас..", так?


 
Сергей Ю   (2006-12-12 13:38) [10]

up


 
Сергей М. ©   (2006-12-12 16:12) [11]


> если у меня 100 клиентов то по идее СерверСокет должен сам
> создавать 100 потоков и их независимо обрабатывать?


Да, если ServerType = stThreadBlocking


> компоненты АДО должны "себе" создать отдельный поток для
> работы с данными?


Нет, АДО-компоненты не создают отдельных потоков.


 
Сергей Ю   (2006-12-13 09:16) [12]


> Да, если ServerType = stThreadBlocking

Т.е. как раз таки то что у меня выставлено stNonBlocking - не правильно сделано? ок. А в чем смысл не подскажите?


> Нет, АДО-компоненты не создают отдельных потоков.

Тогда чем можно воспользоваться для связки с БД mySQL чтоб в процессе работы с ней приложение выполняло бы свои "другие" функции?


 
Сергей Ю   (2006-12-13 13:44) [13]

up


 
Сергей Ю   (2006-12-14 09:47) [14]

Очень актуально!


 
Сергей М. ©   (2006-12-14 12:21) [15]


> у меня выставлено stNonBlocking - не правильно сделано?


Выбор режима нужно делать осознанно, с полным пониманием что/где/когда/как/почему при этом будет происходить.

И "правильно" или "неправильно" при этом не является критерием оценки выбора режима.

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


 
Сергей Ю   (2006-12-14 15:47) [16]


> транспорт этого клиента должен обслуживаться вручную

А что это значит?

И все-таки это щас не самый главный вопрос. Главнее гораздо:
Чем можно воспользоваться для связки с БД mySQL чтоб в процессе работы с ней приложение выполняло бы свои "другие" функции?


 
Сергей М. ©   (2006-12-14 15:58) [17]


> Чем можно воспользоваться для связки с БД mySQL чтоб в процессе
> работы с ней приложение выполняло бы свои "другие" функции?
>


Тем же чем сейчас пользуешься.
Только обращения к БД выполняй в доп.потоке.


 
Сергей М. ©   (2006-12-14 16:02) [18]


> что это значит?


Это значит, что компонент не будет извещать тебя событиями OnClientConnect/Disconnect/Read/Write  о происходящем в канале связи с клиентом.
Вся ответственность за своевременный вызов блокирующих методов приема/передачи в этом режиме возлагается на программиста.



Страницы: 1 вся ветка

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.035 c
1-1161854933
MetalFan
2006-10-26 13:28
2006.12.31
правильная реализация MethodToProcedure


15-1165668405
Сатир
2006-12-09 15:46
2006.12.31
Delphi 7 Build 4.453


15-1165617159
default
2006-12-09 01:32
2006.12.31
Кто как расслабляется на работе?


2-1165673458
Pa5ha
2006-12-09 17:10
2006.12.31
Генератор управлялки к бд


2-1165940591
Фесс
2006-12-12 19:23
2006.12.31
Сортировка жесткого диска