DataSnap не закрывал соединение с SQL Server - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть DataSnap Server с подключением к базе данных MS SQL Server.Я использую объекты Zeos Connection.Клиент - приложение для Android.Оба сделаны в Delphi XE10.2.Когда мой Android-клиент потерял соединение с DataSnap Server, соединение с MS SQL Server остается активным и никогда не закрывается.Если я изящно закрываю клиентское приложение Android, то этого не происходит.После некоторых отключений я получаю сообщение об ошибке db 10029 - Максимальное количество уже выделенных DBPROCESS и я должен перезапустить свой сервер DataSnap.Что мне делать.

Серверное приложение DataSnap выглядит следующим образом.

Форма блока ServerContainer:

object ServerContainer1: TServerContainer1
  OldCreateOrder = False
  Height = 271
  Width = 415
  object DSServer1: TDSServer
    Left = 96
    Top = 11
  end
  object DSTCPServerTransport1: TDSTCPServerTransport
    PoolSize = 100
    Server = DSServer1
    Filters = <>
    Left = 96
    Top = 73
  end
  object DSServerClass1: TDSServerClass
    OnGetClass = DSServerClass1GetClass
    Server = DSServer1
    Left = 200
    Top = 19
  end
end

Код:

unit ServerContainerUnit1;

interface

uses System.SysUtils, System.Classes,
  Datasnap.DSTCPServerTransport,
  Datasnap.DSServer, Datasnap.DSCommonServer,
  IPPeerServer, IPPeerAPI, Datasnap.DSAuth;

type
  TServerContainer1 = class(TDataModule)
    DSServer1: TDSServer;
    DSTCPServerTransport1: TDSTCPServerTransport;
    DSServerClass1: TDSServerClass;
    procedure DSServerClass1GetClass(DSServerClass: TDSServerClass;
      var PersistentClass: TPersistentClass);

  private
    { Private declarations }
  public
  end;

var
  ServerContainer1: TServerContainer1;

implementation


{$R *.dfm}

uses
  ServerMethodsUnit1, main;

procedure TServerContainer1.DSServerClass1GetClass(
  DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass);
begin
  PersistentClass := ServerMethodsUnit1.TServerMethods1;
end;

end.

Методы сервераЕдиница выглядит следующим образом:

Печать экрана формы

Нет кода, кроме функции EchoString и ReverseString в этом блоке

На стороне клиента Iиметь DataModule с TSQLConnection, TDSProviderConnection и многими TClientDataSets

Одна из процедур в моем клиентском приложении выглядит следующим образом:

procedure A();
begin
  try
    DM.PingCDS.Close;
    DM.PingCDS.Open;
  except
    DM.Konekcija.Close;
    DM.Konekcija.Open;
  end;
  DM.KorisnikCDS.Close;
  DM.KorisnikCDS.Params.ParamByName('aplikacija').Value := 'S';
  DM.KorisnikCDS.Open;
  while not DM.KorisnikCDS.Eof do
  begin
    i := DM.KorisnikCDS.RecNo;
    k := TKorisnik.Create;
    k.user_name := DM.KorisnikCDSUSER_NAME.AsString;
    k.pass := 'd' + inttostr(i);
    k.IDKorisnik := DM.KorisnikCDSID_KORISNIK.AsInteger;
    k.ImeIPrezime := DM.KorisnikCDSIME.AsString + ' ' + DM.KorisnikCDSPREZIME.AsString;
    k.frame := TframeKorisnik.Create(hbKorisnici);
    k.frame.Parent := hbKorisnici;
    k.frame.Korisnik := k;
    k.frame.Position.X := 10 + (i - 1) * k.frame.Width;
    k.frame.Position.Y := 0;
    k.frame.Name := 'frameKorisnik' + IntToStr(k.IDKorisnik);
    k.frame.lblUserName.Text := k.user_name;
    k.frame.Opacity := 0.7;
    ms := TMemoryStream.Create;
    (DM.KorisnikCDSSLIKA as TBlobField).SaveToStream(ms);
    ms.Position := 0;
    k.frame.imgKorisnik.Bitmap.LoadFromStream(ms);
    ms.Free;
    k.frame.OnTap := TapKorisnik;
    //k.frame.OnMouseUp := KornisnikMouseUP;
    ListaKorisnika.Add(k);
    DM.KorisnikCDS.Next;
  end;
  DM.KorisnikCDS.Close;
end;

Вы видите, что я создал запрос Ping, чтобы определить, является ли соединение с сервером DataSnapеще жив.Если нет, я воссоединяюсь.Я думаю, что это проблема.Если соединение с сервером DataSnap оборвалось, соединение SQL все еще остается активным, и при повторном подключении к серверу DataSnap я вижу новое соединение SQL в мониторе активности.Старый никогда не отключайте

Это экран печати монитора активности с несколькими бесконечными соединениями.

Экран печати монитора активности

Я надеюсь, что любойодин из вас может помочь мне

...