Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 654

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Есть небольшая(ну для кого как) делема.
Проблема в следующем (сначала объясню в общих чертах): некая программа собирает данные с аппаратных контроллеров по каналу GPRS, разбирает данные по полочкам и ложит в БД MySQL. Все хорошо работает, но есть проблема иногда - при каких либо запросах к БД (и SELECT и INSERT и т.д.) вдруг появляется ошибка "SQL Error: Can't connect to MySQL server on 'localhost' (10048)". Т.е. несколько запросов подряд не выполняются - такая ошибка - а потом опять начинает складывать в БД в нормальном режиме.

Теперь по порядку: данные собираются с приборов через TServerSocket, в потоке данные разбираются по переменным. Затем из потока обращаемся к процедуре вставки/запроса данных в/из БД - забыл сказать - на Zeos. Процесс вставки/запроса вставлен в criticalsection. Вот код такой процедуры:

 
procedure TForm1.Sel_Pass(id:integer; out pass_s, key_inputs: string; exist_obj: boolean; out stat_sel_pass: integer);
begin
  crit_sel_pass.Enter;
  stat_sel_pass:=0;
try
  ZConSel_Pass.Connected;
  ZSel_Pass.Params.ParamValues['id']:=id;
  ZSel_Pass.Active:=true;
  if ZSel_Pass.FieldValues['inetpassword']=null then pass_s:='?' else pass_s:=ZSel_Pass.FieldValues['inetpassword'];
  if ZSel_Pass.FieldValues['S28']=null then key_inputs:='0' else key_inputs:=ZSel_Pass.FieldValues['S28'];
  if ZSel_Pass.FieldCount>0 then exist_obj:=true else exist_obj:=false;
  ZSel_Pass.Active:=false;
  ZConSel_Pass.Disconnect;
  stat_sel_pass:=1;
except on e:exception do
 begin
  exist_obj:=false;
  append(f_err);
  writeln(f_err,FormatDateTime('yyyy-mm-dd hh:nn:ss',TDateTime(now))+' ошибка sel_pass - id: '+inttostr(id)+' -
'+(e.Message));
  closefile(f_err);
  ZConSel_Pass.Disconnect;
 end;
end;
  crit_sel_pass.Leave;
end;

Ну вот в принципе и весь вопрос - почему иногда эта процедура идет по пути except? Ни с того ни с сего. Мускул при этом работает, ошибок в логах у него нет, есть еще один сборщик данных (для других приборов) он спокойно работает, без ошибок. Может моя ошибка в самой процедуре, например коннектиться/дисконектиться может и не надо при каждом запросе?

В общем - направьте на путь истинный, заранее спасибо.

Димчик Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Димчик (статус: Посетитель)
Вопрос отправлен: 27 сентября 2011, 21:33
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 28 сентября 2011, 12:13; участников в обсуждении: 4.
corban

corban (статус: 2-ой класс), 28 сентября 2011, 02:31 [#1]:

Программа-то выполняется на том же компе где и мускул стоит?
Егор

Егор (статус: 10-ый класс), 28 сентября 2011, 04:49 [#2]:

судя по "localhost" - да
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 28 сентября 2011, 05:52 [#3]:

зачем коннект/дисконнект для каждой записи?
corban

corban (статус: 2-ой класс), 28 сентября 2011, 06:01 [#4]:

я почему и спрашиваю про размещение приложения и мускула, если на разных машинах то еще можно усмотреть какой-то смысл в постоянных коннектах-дисконектах
Димчик

Димчик (статус: Посетитель), 28 сентября 2011, 07:20 [#5]:

Да, прога и мускул на одной машине, в настройках соединения значится localhost.
Значит коннект/дисконнект убрать можно? Т.е. делаем так - при запуске проги соединяемся с БД а потом просто выполняем запросы.
Для каждого запроса, кстати, свое подключение к БД - всего их четыре.
Или может перед запросом проверка на коннект, если ложь, то пытаемся соединиться, если правда то щелкаем запрос, ну и дисконнекта нету после запроса.
Замечу что ошибка появляется после долго отсутствия интернета, т.е. когда от приборов начинают сыпаться сразу много данных (ну подряд конечно), может как раз из-за постоянного кон/дискон мускул и отбивает этого клиента (прогу).
Димчик

Димчик (статус: Посетитель), 28 сентября 2011, 07:37 [#6]:

Получилось вот так (это другая процедура - Update в запросе)
procedure TForm1.update_outs(r1, r2, id: integer; out stat_upd_outs: integer);
 var d_online: string;
begin
  crit_upd_outs.Enter;
  stat_upd_outs:=0;
try
  if (not ZConUpd_Outs.Connected) then ZConUpd_Outs.Connect;
  d_online:=FormatDateTime('yyyy-mm-dd hh:nn:ss',TDateTime(now));
  ZUpd_Outs.Params.ParamValues['d_online']:=d_online;
  ZUpd_Outs.Params.ParamValues['r1']:=r1;
  ZUpd_Outs.Params.ParamValues['r2']:=r2;
  ZUpd_Outs.Params.ParamValues['id']:=id;
  ZUpd_Outs.ExecSQL;                                
  ZUpd_Outs.ApplyUpdates;
  stat_upd_outs:=1;
except on e:exception do
 begin
  append(f_err);
  writeln(f_err,FormatDateTime('yyyy-mm-dd hh:nn:ss',TDateTime(now))+' îøèáêà update_outs
- id: '+inttostr(id)+' - '+(e.Message));
  closefile(f_err);
 end;
end;
  crit_upd_outs.Leave;
end;
corban

corban (статус: 2-ой класс), 28 сентября 2011, 07:45 [#7]:

если правильно понял, приложение слушает сокеты и при поступлении данных начинает вызывать процедуру подключения к БД? А не проще сделать подключение к БД на стадии запуска приложения?
Димчик

Димчик (статус: Посетитель), 28 сентября 2011, 12:13 [#8]:

Ну вот код выше как раз так и сделан (подключение к БД в Form.Create) - в каждой процедуре только проверка на существующее подключение (на всяк случай)
Сегодня с утра запустил исправленную - посмотрим как будет себя вести

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.02 сек.