KBM服务端的 UniConnection 要实现断线重连(连接 MSSQLServer), 需要以下几个步骤:
一、修改单元文件:kbmMWUniDAC.pas
procedure TkbmMWUNIDACConnection.InternalOpenConnection(ConnectionPool:TkbmMWCustomConnectionPool); begin // Create new database connection using template. with TkbmMWUNIDACConnectionPool(ConnectionPool).FDBTemplate do begin // 针对UniDAC需要增加这个语句,否则连接数据库失败 FDatabase.Server := Server; FDatabase.Database := Database; FDatabase.Username := UserName; FDatabase.Password := Password; FDatabase.LoginPrompt := False; FDatabase.ProviderName := ProviderName; FDatabase.Port := Port; FDatabase.SpecificOptions.Assign(SpecificOptions); // 支持unidac重联 FDatabase.Options.LocalFailover:=Options.LocalFailover; FDatabase.OnConnectionLost:=OnConnectionLost; FDatabase.AfterConnect:=AfterConnect; with TkbmMWUNIDACConnectionPool(ConnectionPool) do if Assigned(FOnSetupDBConnection) then FOnSetupDBConnection(self,FDatabase); end; if FDatabase.ProviderName='SQL Server' then CoInitialize(nil); FDatabase.Open; end;
二. 把 UniConnection 的 Options.LocalFailover:=True ;
三. 在 UniConnection 的 ConnectionLost 事件修改如下:
procedure TDM.CON_AConnectionLost(Sender: TObject; Component: TComponent; ConnLostCause: TConnLostCause; var RetryMode: TRetryMode); begin //断线重联 if (Sender as TUniConnection).Tag<1 then begin RetryMode:=rmReconnectExecute; (Sender as TUniConnection).Tag:=(Sender as TUniConnection).Tag+1; end else begin RetryMode:=rmRaise; (Sender as TUniConnection).Tag:=0; end; end;
四、如果在服务端的函数里有调用 UniQuery 或其他数据库组件,在函数的开头加:CoInitialize(nil); 结尾加:CoUninitialize;