DataSnap没有关闭SQL Server连接的

时间:2019-04-23 08:58:57

标签: delphi datasnap

我有连接到MS SQL Server数据库的DataSnap Server。我使用Zeos Connection对象。客户端是Android应用程序。两者都是在Delphi XE10.2中制作的。当我的Android客户端失去与DataSnap Server的连接时,与MS SQL Server的连接仍然保持活动状态,并且永远不会关闭。如果我正常关闭Android客户端应用程序,则不会发生。断开连接后,我收到消息数据库错误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.

服务器方法单元如下:

Print screen of form

除EchoString和ReverseString函数外,没有任何代码

在客户端,我具有带有TSQLConnection,TDSProviderConnection和许多TClientDataSet的DataModule

我的客户端应用中的一个过程如下:

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 Server的连接是否仍然有效。如果没有,我重新连接。我认为这就是问题所在。如果与DataSnap服务器的连接断开,则SQL连接仍保持活动状态,当我重新连接至DataSnap服务器时,在“活动”监视器中看到新的SQL连接。老家伙永不断开

这是活动监视器的打印屏幕,几乎没有连接。

Print screen of Activity monitor

我希望你们中的任何一个都能帮助我

0 个答案:

没有答案