|
Вопрос # 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) - в каждой процедуре только проверка на существующее подключение (на всяк случай)
Сегодня с утра запустил исправленную - посмотрим как будет себя вести
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|