[Delphi] Forma z SQL 'zasypia'

0

Witam.
Posiadam taki problem:
Mam 3 formy: Tabela, Baza, Tabela2. Tabela i Tabela2 są formami widocznymi z różnymi komponentami, zaś Engine posiada jedynie elementy do połączenia się z bazą i funkcje, jest uruchamiana, ale niewidoczna.
Formy to tak pokrótce:

Tabela

uses Baza; 

TTabela.Funkcja;
begin
  Engine.Wypis;
end;

Baza:

TEngine.Wypis;
begin
  // przyklad
  ZConnection1.Connected:=True;
  ZQuery1.SQL.Add("Select * from baza");
  ZQuery1.Open;
end;

Tabela2:

TTabela2.Wypis;
begin
  //polaczenie z ta sama baza co w Engine
  //te same operacje na Quey
end;

Program dobrze się kompiluje, i wykonuje wszystkie operacje jakie są jej zadane. Dopiero gdy zostawię program na np. 10min to funkcja Wypis z Tabeli2 wciąż się wykonuje, ale już Wypis z Engine nie, gdyż wychodzi błąd ERROR 2003: Can't connect to MySQL server on 'adresIP' (10060). Tak jakby forma niewidoczna usnęła i traci połączenie.

0

Jeżeli zapytanie jest select to należy używać open. Poza tym nie zwraca się wszystkich rekordów (chyba że to test), bo może ich być miliony. Może to jest powodem.

0

Przy Selectach:
ZQuery1.Open;

0

Poprawiłem na Open w każdym możliwym przypadku, ale baza dalej się wiesza. I na mojej bazie aktualnie jest ok. setka rekordów.

0

wnioskuje że używasz komponentów ZEOS.
Więc problem twój polega na tym że komponenty te nie podtrzymują połączenia z bazą.
Sam musisz sobie takie połączenie podtrzymywać.
Ja to rozwiązałem stosując przed każdą operacją procedure która sprawdzała czy połączenie nadal jest aktywne a jeśli go nie było to łączyła z bazą i dopiero wykonywała dalsze instrukcje.

procedure IsConnected;
begin
try
Data.SQL.Clear;
Data.SQL.Add('select CURRENT_DATE');
Data.ExecSQL;
except
MySQL.Disconnect;
MySQL.Connect;
Data.SQL.Clear;
Data.SQl.Add('SET Names latin2');
Data.ExecSQL;
Data.SQL.Clear;
end;
end;

Wywołaj ją przed każdą operacją jaką wykonujesz na bazie i zniknie twój problem z rozłączaniem się aplikacji z bazą.

Możesz też użyć komponentów ADO które mają standardowo wbudowaną obsługę podtrzymywania połączenia.
Jednak musisz zdać sobie sprawę z tego że jeżeli masz wykupiony serwer na którym masz bazę MySQL to często są tam ograniczenia co do ilości jednoczesnych połączeń do bazy.
Ja np. korzystam z usług home.pl gdzie jest ograniczenie do 5 jednoczesnych połączeń. Jeżeli robisz aplikacje z której ma kokoRZystaćystać kilkunastu userów to sprawdź co się będzie działo jak uruchomisz więcej niż kilka kopii aplikacji w tym samym czasie.
Taka moja mała sugestia.

0

Trochę trwało bo coś nie miałem czasu się tym zajmować.

Puchi zmodyfikowałem lekko twoją funkcję:

procedure IsConnected;
begin
try
showmessage('1');
Data.SQL.Clear;
Data.SQL.Add('select CURRENT_DATE');
Data.Open;
except
showmessage('2');
MySQL.Disconnect;
MySQL.Connect;
Data.SQL.Clear;
Data.SQl.Add('select CURRENT_DATE');
Data.Open;
end;
end;

Jednak przy wykonywaniu programu gdzie się wiesza, wyskakuje okno z 1, ale już z 2 nie jakby blok except nie uruchamiał się, choć program wciąż się wiesza i nie uruchamia zaspanego połączenia.

0

a dlaczego robisz Data.Open??

zostaw tak jak ci napisałem. Umnie działa bez problemowo

0
siararadek napisał(a)

Program dobrze się kompiluje, i wykonuje wszystkie operacje jakie są jej zadane. Dopiero gdy zostawię program na np. 10min to funkcja Wypis z Tabeli2 wciąż się wykonuje, ale już Wypis z Engine nie, gdyż wychodzi błąd ERROR 2003: Can't connect to MySQL server on 'adresIP' (10060). Tak jakby forma niewidoczna usnęła i traci połączenie.

Skoro serwer zwraca ci takie błędy - sprawdź jak masz ustawione zmienne systemowe na serwerze, którego używasz.

Podepnij się jakąś konsolą do serwera (np. natywnym narzędziem mysql lub z poziomu swojego programu) i wykonaj poniższe zapytanie:

SHOW VARIABLES LIKE '%timeout%'

interesują cię zmienne:

interactive_timeout i
wait_timeout

domyślnie są ustawione na 28800 sekund.

oprócz tego jest jeszcze parametr:

connect_timeout

Ale to się tyczy tylko i wyłącznie sytuacji kiedy się podłączasz.

Więcej informacji pod tym adresem: http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1