Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Вниз

Работа с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.042 c
15-1165530445
vuk
2006-12-08 01:27
2006.12.31
Вопрос для Torry.


15-1165690868
Strate
2006-12-09 22:01
2006.12.31
Венгерский алгоритм транспортной задачи


2-1165763056
__Алексей
2006-12-10 18:04
2006.12.31
Корректная работа с записями, содержащими string.


2-1165897474
Kvinta
2006-12-12 07:24
2006.12.31
Вернуть Field а ADO


2-1165890072
dreamse
2006-12-12 05:21
2006.12.31
Подскажите метод генерации нового имени RealTime компонента





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский