参见:Delphi 中 FireDAC 数据库连接(总览)

描述了如何在不稳定的环境中工作。FireDAC允许一个应用程序从连接失败中恢复。

一、概述

一个数据库应用程序可以在一个不稳定的环境中工作,网络可能被物理断开或DBMS服务器可能被重新启动。应用程序需要从这种中断中无缝恢复并继续与DBMS进行通信。

FireDAC的自动连接恢复功能允许你检测到连接丢失的情况,并对这种情况作出正确的反应和恢复。只有在执行特定的DB操作时,如Open、ExecSQL或Ping,才会发现丢失。然后DBMS驱动会引发EFDDBEngineException,Kind = ekServerGone。

验证连接状态和/或保持连接活力的最简单方法是调用TFDCustomConnection.Ping方法。Ping方法甚至可以在连接被关闭时使用,以查看何时可以建立连接。

已知的限制如下:

DBMS

说明

Advantage Database

  • 不支持本地自由连接。

dbExpress bridge driver

- FireDAC可能无法检测到ekServerGone。

- 不支持Ping方法。

Informix

需要将DirectExecute设置为True。

Microsoft Access

不支持。

MySQL

为了尽量减少网络连接丢失时的呼叫延迟,考虑调整ReadTimeout和WriteTimeout连接定义参数。

ODBC bridge driver

  • FireDAC可能无法检测到ekServerGone。

  • 不支持Ping方法。

SQLite

不支持。

二、控制连接恢复

要启用自动连接恢复,请将ResourceOptions.AutoReconnect设置为True。可以选择使用TFDCustomConnection事件处理程序。

  • OnRecover - 响应连接丢失事件,为FireDAC提供下一步行动。

  • OnLosted - 当连接丢失并且没有恢复时触发。

  • OnRestored - 当一个连接丢失并恢复时触发。

TFDCustomConnection.OnRecover事件处理程序的响应可能是重新建立连接,进入离线模式,或者干脆关闭连接。当OnRecover没有被指定时,FireDAC会尝试重新建立连接。比如说:

procedure TForm1.FDConnection1Recover(ASender: TObject;
  const AInitiator: IFDStanObject; AException: Exception;
  var AAction: TFDPhysConnectionRecoverAction);
var
  iRes: Integer;
begin
  iRes := MessageDlg('Connection is lost. Offline - yes, Retry - ok, Fail - Cancel',
    mtConfirmation, [mbYes, mbOK, mbCancel], 0);
  case iRes of
  mrYes:    AAction := faOfflineAbort;
  mrOk:     AAction := faRetry;
  mrCancel: AAction := faFail;
  end;
  Log('Connection is recovering');
end;

我们强烈建议你不要在OnRecover、OnLost和OnRestored事件处理程序中关闭FireDAC管理器,因为这可能导致意外的问题。

三、准备申请

当一个连接被恢复时,以下状态会丢失。

  1. 活动的事务被回滚,从失败的语句开始继续执行。

  1. 尚未被获取的结果集被修剪,TFDDataSet.SourceEOF被设置为True。

  1. 数据库会话状态丢失,包括Oracle包状态和会话变量。

  1. 已注册的数据库警报被取消注册。

为了让你的应用程序准备好在不稳定的环境中工作,并尽量减少故障影响,请设置以下选项值:

Set this option

To the following value

FetchOptions.Mode

fmAll

FetchOptions.RowsetSize

200 - 300

FetchOptions.AutoClose

True (the default)

TxOptions.AutoCommit

True

ResourceOptions.AutoReconnect

True

该应用程序可以使用离线连接模式和CachedUpdates。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐