DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: ajmly
今日帖子: 30
在线用户: 21
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2018/11/29 10:09:52
标题:
Datasnap连接池 浏览:1802
加入我的收藏
楼主: 请教大家,

Datasnap服务器中如果放有DataModule了,DataModule里放上Connection控件,那是否还有必要再使用连接池?
----------------------------------------------
-把学习当信仰
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2018/11/29 10:26:07
1楼: 假设服务器上的函数都是这样使用连接:

function XXX:Tstream ;
begin
with DataModule.con do  //DataModule上放置的共用连接
begin
  ...
end;
end;

这样的话,如果多个函数同时执行的话,各个函数是否要依次等待其它函数调用完毕才能使用?
----------------------------------------------
-把学习当信仰
作者:
男 grjs_2004 (grjsITname) ★☆☆☆☆ -
盒子活跃会员
2018/11/29 11:39:13
2楼: 服务会自动创建一个指针,对应客户端的请求,当用户完成请求时,会自动释放
----------------------------------------------
Everyone will to do best!
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2018/11/29 11:45:01
3楼: 这种所有线程都使用DM中的连接的方式,是否有效率的问题? 网上大多数的文章说的是 多线程从一个连接池里取一个连接,这样的话跟使用DataModule中连接有何区别?
----------------------------------------------
-把学习当信仰
作者:
男 grjs_2004 (grjsITname) ★☆☆☆☆ -
盒子活跃会员
2018/11/29 14:16:06
4楼: 使用连接池,就是建立一个池子存放连接对象,客户端有请求时,找池子里空闲的连接来使用,客户端使用完之后,在放回池里,标记空闲。

使用连接池,就是节省掉临时创建和销毁连接对象的时间,而且不停的创建和销毁,会产生比较多的垃圾文件,比如系统日志等。
----------------------------------------------
Everyone will to do best!
作者:
男 akai1203 (w-dins) ★☆☆☆☆ -
普通会员
2018/11/29 16:10:26
5楼: DataModule上放的控件只创建一次吧
----------------------------------------------
-把学习当信仰
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
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的
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2019/5/30 11:52:19
8楼: 池,就是优化建立连接的时间,客户与中间件连接,中间件与数据库连接,而连接数据库一般耗时,所以中间件预先建好一批FDconnect实例,存于池中,随用随取,用后归还。
datasnap REST一般采取http通讯,客户端与中间件建立连接很快,但datasnap与服务器建立连接需要一些时间。

现在问题是,fdconnect必须建在ServerMethodsUnit1单元,而datasnap会自动根据客户连接维护TServerMethods的创建于销毁,所以池也许根本管理不了连接。
----------------------------------------------
-
作者:
男 wuxiangyang (wxy) ★☆☆☆☆ -
盒子活跃会员
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个。

希望对你有帮助
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS