У меня есть 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 в мониторе активности.Старый никогда не отключайте
Это экран печати монитора активности с несколькими бесконечными соединениями.
Экран печати монитора активности
Я надеюсь, что любойодин из вас может помочь мне