zator portów przy socketach

0

Jest sobie jedna aplikacja serwisowa, ktora trzyma polaczenie z baza mysql oraz ma lacznosc poprzez socket z druga aplikacja(odbiera od niej informacje i zapisuje do bazy). Problem z tym ze zawsze po okolo 1,5 dnia, na komputerze gdzie jest ta druga aplikacja, mysql zaczyna 'wisiec'. Jak zresetuje serwisy to wtedy juz wraca wszystko do normy. W aplikacji serwisowej mam co okolo 2h na 5 sekund

Socket.Active := False;
MySQL.Disconnect;  //(ADO)

Jakies pomysly czemu to sie dzieje i jak temu zaradzic ? Serwis chodzi nonstop.

0
service app napisał(a)

JW aplikacji serwisowej mam co okolo 2h na 5 sekund

Socket.Active := False;
MySQL.Disconnect;  //(ADO)

a można wiedzieć po co?

0

Bo baza sie blokowala(brak mozliwosci zalogowania) , dopiero po resecie serwisu dzialala dobrze wiec dalem testowo wylaczenie socketa i odlaczenie od bazy co jakis czas, ale problem jest nadal.

0

Nie wiem czy bedzie Ci sie chcialo ogladac, ale zarzuce kod.

procedure TSOL_CHE.ServiceExecute(Sender: TService);
begin
  Timer1.Enabled := True;
  while not Terminated do
    ServiceThread.ProcessRequests(True);
  Timer2.Enabled := False;
  MySQL_Serwer.Disconnect;
  MySQL_Lokalny.Disconnect;
  Client.Active := False;
end;

procedure TSOL_CHE.Timer1Timer(Sender: TObject);
begin
  Sekundy := 0;
  MySQL_Serwer.Connect;
  if(MySQL_Serwer.Connected) then
  begin
    MySQL_Lokalny.Connect;
    Client.Active := True;
    if(MySQL_Lokalny.Connected) then
    begin
      Timer1.Enabled := False;
      Timer2.Enabled := True;
    end;
  end;
end;

procedure TSOL_CHE.Timer2Timer(Sender: TObject);
var
  ID : string;
  OK : Boolean;
  Zapytanie : string;
begin
  if not Client.Socket.Connected then
    Client.Active := True;
  Q_Lokalny.SQL.Text := 'SELECT ID,Zapytanie FROM AktualizujSerwer LIMIT 1';
  Q_Lokalny.Open;
  if not(Q_Lokalny.IsEmpty) then
  begin
    Timer2.Interval := Wysylanie;
    Zapytanie := Q_Lokalny.FieldByName('Zapytanie').AsString;
    ID := Q_Lokalny.FieldByName('ID').AsString;
    OK := MySQL_Serwer.Connected;

    if not(OK) then
    begin
      MySQL_Serwer.Connect;
      OK := MySQL_Serwer.Connected;
    end;

    if(OK) then
    begin
      Q_Serwer.SQL.Text := Zapytanie;
      Q_Serwer.Execute;
      Q_LokalnyUsun.SQL.Text := 'DELETE FROM AktualizujSerwer WHERE ID=:ID';
      Q_LokalnyUsun.ParamByName('ID').AsString := ID;
      Q_LokalnyUsun.Execute;
    end;

  end
    else
      Timer2.Interval := WysylanieOp;
  Q_Lokalny.Close;

  Inc(Sekundy);
  if(Sekundy > 500) then
  begin
    MySQL_Serwer.Disconnect;
    MySQL_Lokalny.Disconnect;
    Timer2.Enabled := False;
    Timer1.Enabled := True;
  end;
end;
0

Mozesz z poziomu swojej aplikacji resetowac serwer MySQL jesli polaczenie z bazą nie powiedzie się X razy. Proste rozwiązanie ale skuteczne.

Pozdro 600

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