先写池子的函数
const
COraclePooledName = 'Ora_Pooled';
function TdmConn.AcquireConnection: TFDConnection;
begin
log.TrackMethod('TdmConn.AcquireConnection');
Result := TFDConnection.Create(nil);
Result.ConnectionDefName := COraclePooledName;
try
Result.Connected := True;
except
on E: Exception do
begin
FreeAndNil(Result);
log.LogException(E);
raise E;
end;
end;
end;
function TdmConn.ReleaseConnection(var Conn: TFDConnection): Boolean;
begin
log.TrackMethod('TdmConn.ReleaseConnection');
Result := True;
Conn.Close;
FreeAndNil(Conn);
end;
procedure TdmConn.DataModuleCreate(Sender: TObject);
const
Section = 'Oracle';
var
Params: TStringList;
begin
Params := TStringList.Create;
with TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')) do
begin
FDManager.Close;
Params.Add(Format('Database=%s', [ReadString(Section, 'ConnStr', '')]));
Params.Add('Pooled=True');
Params.Add('DriverID=Ora');
Params.Add('User_Name=xxx');
Params.Add('Password=xxx');
Params.Add('OSAuthent=No');
Params.Add(Format('POOL_MaximumItems=%d', [ReadInteger(Section, 'PoolMaximumItems', 30)]));
Params.Add(Format('POOL_CleanupTimeout=%d', [ReadInteger(Section, 'PoolCleanupTimeOut', 30000)]));
Params.Add(Format('POOL_ExpireTimeout=%d', [ReadInteger(Section, 'PoolExpireTimeout', 90000)]));
FDManager.AddConnectionDef(COraclePooledName, 'Ora', Params);
Free;
end;
FreeAndNil(Params);
end;
procedure TdmConn.DataModuleDestroy(Sender: TObject);
begin
FDManager.CloseConnectionDef(COraclePooledName); //close all pooled conn
FDManager.Close;
end;
然后再使用池子
unit sSample;
interface
uses
Data.DB, Datasnap.DBClient, Datasnap.Provider,
FireDAC.Comp.Client, System.SysUtils,
Data.DBXJSONReflect, System.JSON,
uServerMethod;
type
TSmSample = class(TServerMethod)
public
function ServerTime: TDateTime;
function GetTblImage: TDataSet;
end;
implementation
{ TSmSample }
uses
dConn, uLog, System.StrUtils;
procedure CopyQueryToClientDataSet(SrcQuery: TDataSet; var DstQuery: TDataSet);
var
DataSetProvider: TDataSetProvider;
begin
try
if DstQuery = nil then
DstQuery := TClientDataSet.Create(nil); //will be freed by TDSServerConnectionHandler.DbxCommandClose or TDSMethodValues.AssignParameterValues 's ClearReferenceParameters
DataSetProvider := TDataSetProvider.Create(nil);
DataSetProvider.DataSet := SrcQuery;
TClientDataSet(DstQuery).Data := DataSetProvider.Data;
finally
FreeAndNil(DataSetProvider);
end;
end;
function TSmSample.GetTblImage: TDataSet;
var
Conn: TFDConnection;
Query: TFDQuery;
begin
Conn := dmConn.AcquireConnection;
Query := TFDQuery.Create(nil);
try
Query.Connection := Conn;
Query.SQL.Text := 'SELECT * FROM tbl_image';
Query.Active := True;
CopyQueryToClientDataSet(Query, Result);
finally
if Assigned(Query) then
FreeAndNil(Query);
dmConn.ReleaseConnection(Conn);
end;
end;
function TSmSample.ServerTime: TDateTime;
var
Conn: TFDConnection;
Query: TFDQuery;
begin
//raise Exception.Create('hahaha');
Conn := dmConn.AcquireConnection;
Query := TFDQuery.Create(nil);
try
Query.Connection := Conn;
Query.SQL.Text := 'SELECT sysdate FROM dual';
Query.Active := True;
Result := Query.FieldByName('sysdate').AsDateTime;
finally
FreeAndNil(Query);
dmConn.ReleaseConnection(Conn);
end;
end;
initialization
RegisterServerMethodClass(TSmSample);
finalization
end.
是不是觉得挺爽,这里需要留意的是由于Conn要在服务方法内一定还给连接池,所以做的TFDQuery需要Copy给TClientDataSet这样的内存DataSet才走的通。
您好,刚开始学习DATASNAP,好不容易在网上找到您的文章.能不能发个dConn, uLog,这两个文件学习一下呀.谢谢.
回复删除