| 
| 
 | Вопрос # 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 (статус: 2-ой класс), 28 сентября 2011, 02:31 [#1]:Программа-то выполняется на том же компе где и мускул стоит? |  
|   | Егор (статус: 10-ый класс), 28 сентября 2011, 04:49 [#2]:судя по "localhost" - да Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Мережников Андрей (статус: Абитуриент), 28 сентября 2011, 05:52 [#3]:зачем коннект/дисконнект для каждой записи? |  
|   | 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 (статус: 2-ой класс), 28 сентября 2011, 07:45 [#7]:если правильно понял, приложение слушает сокеты и при поступлении данных начинает вызывать процедуру подключения к БД? А не проще сделать подключение к БД на стадии запуска приложения? |  
|   | Димчик (статус: Посетитель), 28 сентября 2011, 12:13 [#8]:Ну вот код выше как раз так и сделан (подключение к БД в Form.Create) - в каждой процедуре только проверка на существующее подключение (на всяк случай) Сегодня с утра запустил исправленную - посмотрим как будет себя вести
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |