我有连接到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.
服务器方法单元如下:
除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
我希望你们中的任何一个都能帮助我