zoukankan      html  css  js  c++  java
  • FireDAC的连接池

    FireDAC的连接池和一般理解的连接池有些区别。FireDAC的架构是分层设计的,平常我们用的都是高层的应用层。比如TFDConnection,具体连接什么,还要物理层的支持,就是那些TFDPhysXXXLink这些控件。所以只要一个FDConnection控件,就可以直接支持池,只要设置了池连接参数,开启池功能,就可以直接使用。(不是平常理解的建立一个FDConnection列表,然后外部管理这个列表来实现池,原来的TSQLConnection也是这样的,内部直接支持池。)。同时,用TFDManager来管理物理连接参数列表(TFDManager可以建立持久的(有唯一名字、保存在ini文件的),私有的(有唯一名字、只存在TFDManager中,不保存到ini文件),临时的(无名字,也不要TFDManager管理,直接在FDConnection控件设置,比如我们在设计界面打开FDConnection控件的连接设置界面,且不从以定义的列表选择连接名,而是直接设置各个连接参数,也就是直接保存在FDConnection.Params中)),只有持久的,私有的可以建立连接池,并且可以共享给其它代码使用(具体见帮助文档)。

    FireDAC supports 3 connection definition kinds:

    这3种连接的建立DEMO,帮助文档也有示例。

    用FDManager保存的持久或私有连接参数,可以这样

    持久的(ini文件):

    [DataSnapCONNECTION]
    DriverName=DataSnap
    HostName=localhost
    port=211

    [MSSQLConnection]
    SchemaOverride=sa.dbo
    DriverName=MSSQL
    HostName=ServerName
    DataBase=Database Name
    User_Name=user
    Password=password
    BlobSize=-1
    ErrorResourceFile=
    LocaleCode=0000
    IsolationLevel=ReadCommitted
    OS Authentication=False
    Prepare SQL=False
    ConnectTimeout=60
    Mars_Connection=False

    [MySQLConnection]
    DriverName=MySQL
    HostName=ServerName
    Database=DBNAME
    User_Name=user
    Password=password
    ServerCharSet=
    BlobSize=-1
    ErrorResourceFile=
    LocaleCode=0000
    Compressed=False
    Encrypted=False
    ConnectTimeout=60

    [OracleConnection]
    DriverName=Oracle
    DataBase=Database Name
    User_Name=user
    Password=password
    RowsetSize=20
    BlobSize=-1
    ErrorResourceFile=
    LocaleCode=0000
    IsolationLevel=ReadCommitted
    OS Authentication=False
    Multiple Transaction=False
    Trim Char=False
    Decimal Separator=.

    [SQLITECONNECTION]
    DriverName=Sqlite
    Database=test.db

    以上摘录自delphi自带的dbxconnections.ini文件,一般保存在路径:C:UsersPublicDocumentsEmbarcaderoStudioFireDACFDConnectionDefs.ini.  

    私有的:

    var
      oParams: TStrings;
    begin
      oParams := TStringList.Create;
      oParams.Add('Database=ORA_920_APP');
      oParams.Add('User_Name=ADDemo');
      oParams.Add('Password=a');
      oParams.Add('Pooled=True');
      FDManager.AddConnectionDef('Oracle_Pooled', 'Ora', oParams);
      .....................
      FDConnection1.ConnectionDefName := 'Oracle_Pooled';
      FDConnection1.Connected := True;

    或者

    with FDManager.ConnectionDefs.AddConnectionDef do
    begin
    Name := 'MSSQL_Connection';
    Params.Values['DriverID'] := 'MSSQL';
    Params.Values['Server'] := '(Local)';
    Params.Values['Database'] := 'Northwind';
    Params.Values['OSAuthent'] :='No';
    Params.Values['User_Name'] := 'sa';
    Params.Values['Password'] := '123';
    Params.PoolMaximumItems := 50; //系统默认50
    Params.Pooled := True;  //这个是关键
    end;
    
    ..........
    FDConnection.ConnectionDefName := 'MSSQL_Connection';
    
    FDConnection.Connected := True;

    当FDConnection.Connected := True;时,就会从连接池里获得一个物理连接,设置为False,物理连接就释放回连接池(注意释放回池里的FDConnection的连接状态保持为连接!!!)。

    要关闭和摧毁物理连接,用:

    FDManager.CloseConnectionDef('MSSQL_Connection');
    或者全部:
    FDManager.Close;
    
    其它的一些时间参数设置(摘自帮助文档):
    在一般单线程运用中,用一个TFDConnection来建立连接,只要打开池并且设置了FDManager连接参数,就可以了。
    在多程序运用中,每个线程还是要创建一个TFDConnection,然后各个线程可以共享FDManager,因为FDManager是单实例的。(我是这么理解的,多线程中,FDConnection不是池化的,但是物理连接是池化的)。

    DELPHI有2个Sample:
    C:UsersPublicDocumentsEmbarcaderoStudio19.0SamplesObject PascalDatabaseFireDACSamplesComp LayerTFDConnectionPooling
    C:UsersPublicDocumentsEmbarcaderoStudio19.0SamplesObject PascalDatabaseFireDACSamplesPhys LayerIFDPhysConnectionPooling
     
  • 相关阅读:
    flash 3d基础学习
    3d中的镜头
    [转]Android Canvas 切割 clipRect
    绘制球形
    绘制圆筒
    stage3d学习笔记1
    (转)Region.Op效果解析
    游戏中的镜头
    无向网的最小生成树——Prim算法(转)
    最短路径之——Dijkstra算法(转)
  • 原文地址:https://www.cnblogs.com/sttchengfei/p/12848758.html
Copyright © 2011-2022 走看看