Форум: "Начинающим";
Текущий архив: 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