导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2018/11/29 10:09:52
标题:
加入我的收藏
楼主:
请教大家, Datasnap服务器中如果放有DataModule了,DataModule里放上Connection控件,那是否还有必要再使用连接池?
----------------------------------------------
-把学习当信仰
作者:
2018/11/29 10:26:07
1楼:
假设服务器上的函数都是这样使用连接: function XXX:Tstream ; begin with DataModule.con do //DataModule上放置的共用连接 begin ... end; end; 这样的话,如果多个函数同时执行的话,各个函数是否要依次等待其它函数调用完毕才能使用?
----------------------------------------------
-把学习当信仰
作者:
2018/11/29 11:39:13
2楼:
服务会自动创建一个指针,对应客户端的请求,当用户完成请求时,会自动释放
----------------------------------------------
Everyone will to do best!
作者:
2018/11/29 11:45:01
3楼:
这种所有线程都使用DM中的连接的方式,是否有效率的问题? 网上大多数的文章说的是 多线程从一个连接池里取一个连接,这样的话跟使用DataModule中连接有何区别?
----------------------------------------------
-把学习当信仰
作者:
2018/11/29 14:16:06
4楼:
使用连接池,就是建立一个池子存放连接对象,客户端有请求时,找池子里空闲的连接来使用,客户端使用完之后,在放回池里,标记空闲。 使用连接池,就是节省掉临时创建和销毁连接对象的时间,而且不停的创建和销毁,会产生比较多的垃圾文件,比如系统日志等。
----------------------------------------------
Everyone will to do best!
作者:
2018/11/29 16:10:26
5楼:
DataModule上放的控件只创建一次吧
----------------------------------------------
-把学习当信仰
作者:
2019/5/29 11:17:52
6楼:
连接池与ServerMethodsUnit1单位的关系,真的很难緾清。 在datasnap rest中,如果LifeCycle使用默认的Session模式,将为每个活动连接创建一个session实例,而每个session都有一个fdconnection,似乎已经具备连接池功能。 datasnap或datasnap rest中,fdconnection和fdquery都是定义在ServerMethodsUnit1中,datasnap会自动管理此单元会话,也就是会为每个连接创建ServerMethodsUnit1单元中所有组件的实例,肯定也包括了fdconnection的实例。 所以我也不知道是否为该为datasnap开户连接池功能,
----------------------------------------------
-
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2019/5/29 23:48:15
7楼:
fireDAC的fdconnection, 看帮助文档,意思大体如下: 如果设置了池化pooled:=True,就是用了连接池功能了,这是指物理连接,但是控件本身TFDConnection这个对象是没有池化的,当fdconnection.Open,就取一个物理连接,fdconnection.Close,就释放物理连接。。。 大侠们是不是这样的?那TFDConnection控件本身要不要用个对象池?每次TFDConnection.Create(),TFDConnection.Free会不会影响效率?DEMO里的池是直接这样Create()和Free的
----------------------------------------------
-
作者:
2019/5/30 11:52:19
8楼:
池,就是优化建立连接的时间,客户与中间件连接,中间件与数据库连接,而连接数据库一般耗时,所以中间件预先建好一批FDconnect实例,存于池中,随用随取,用后归还。 datasnap REST一般采取http通讯,客户端与中间件建立连接很快,但datasnap与服务器建立连接需要一些时间。 现在问题是,fdconnect必须建在ServerMethodsUnit1单元,而datasnap会自动根据客户连接维护TServerMethods的创建于销毁,所以池也许根本管理不了连接。
----------------------------------------------
-
作者:
2019/5/30 16:00:17
9楼:
我在rest 服务端建立了一个关于数据连接引擎的单元类TDataProcess,定义了FDManager: TFDManager; 数据连接管理器,数据访问交互单元类TDataServer。 // 创建数据访问通道 Function TDataProcess.GetFDManager(FDManager: TFDManager): Boolean; var FParams: TStrings; begin FParams := TStringList.Create; FParams.Add('DriverID=Ora'); FParams.Add('Database='+FDatabase); FParams.Add('User_Name='+FUserName); FParams.Add('Password='+FPassword); FParams.Add('CharacterSet=utf8'); FParams.Add('Pooled=true'); FParams.Add('PoolMaximumItems=10'); FParams.Add('autoRecon_nect=true'); FDManager.Close; FDManager.AddConnectionDef('Con_Pooled','Ora',FParams); FDManager.Active := True; FParams.Free; end; //创建连接 function TDataProcess.GetConnection: TFDConnection; var TempConnection: TFDConnection; begin if not assigned(FDManager) then begin FDManager := TFDManager.Create(nil); GetFDManager(FDManager); end; TempConnection := TFDConnection.Create(nil); TempConnection.LoginPrompt := False; TempConnection.Close; TempConnection.Params.Clear; TempConnection.ConnectionDefName := 'Con_Pooled'; Result := TempConnection; end; //释放连接 procedure TDataProcess.FreeConnection(Connection: TFDConnection); begin if assigned(Connection) then begin Connection.Close; Connection.Free; end; end; 在ServerMethodsUnit1的接口函数里接收到JSON 报文,解析后,保存入库 function TServerMethods1.PdCurrentData(JsonDoc: string): Boolean; begin ... TR_PdCurrent.SubstationId := jo.S['substationid']; TR_PdCurrent.EquipmentInfoID := jo.S['equipmentinfoid']; TR_PdCurrent.VoltagelevelID := jo.S['voltagelevelid']; ... //TServerMethods1只提供JSON 报文的解析,数据访问在定义在其它单元,引用数 //据访问单元的保存数据函数; GetDataServer.InsertPdCurrent(TR_PdCurrent); end; //保存数据 function TDataServer.InsertPdCurrent(var TR_PdCurrent: TTR_PdCurrent): Boolean; var FQuery: TFDQuery; FDConnection: TFDConnection; begin FQuery := TFDQuery.Create(nil); FDConnection := FDataProcess.GetConnection; FQuery.Connection := FDConnection; FQuery.Close; FQuery.SQL.Text := ''// 要保存的数据 FQuery.ExecSQL; FQuery.Free; FreeConnection(FDConnection); end; 在并发查询和保存数据的测试中 FDManager.ConnectionCount 的创建连接数量会增加,任务结束会减少到最少,我这里定义了最大连接数为10个。 希望对你有帮助
----------------------------------------------
-