Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[DocWiki 번역] 연결을 복구하기 (FireDAC)


Recommended Posts

Docwiki에 있는 "Recovering Connection (FireDAC)"을 번역한 글: 번역일: 2022년 4월 4일)

위로 가기: [DocWiki 번역] 연결(connection)을 가지고 작업하기 (FireDAC)

 

안정적이지 않은 환경에서 작동하는 방법을 설명한다. FireDAC을 사용하면, 애플리케이션에서 연결 실패를 회복할 수 있다.

목차


1 일반 (General)

데이터베이스는 안정적이지 않은 환경에서 작동하는 경우가 있다. 즉, 물리적으로 네트워크가 끊길 수도 있고, DBMS 서버가 재시작될 수도 있다. 애플리케이션은 자연스럽게 이런 방해를 복구하고 DBMS와 통신을 지속할 수 있어야 한다.

FireDAC의 자동 연결 복구를 사용하면, 연결이 끊졌을 때 탐지할 수 있고, 올바르게 대응하고 상황을 회복할 수 있다. 연결 끊김을 DB의 특정 행위 (예: Open,  ExecSQL, Ping 등등)가 수행될 때에만 탐지할 수 있다. 탐지되면 해당 DBMS 드라이버에서 Kind = ekServerGone인 EFDDBEngineException을 일으킨다.

TFDCustomConnection.Ping 메소드를 호출하면,연결 상태를 검증하기 그리고/또는 연결을 계속 살아있도록 유지하기를 가장 간단하게 할 수 있다. Ping 메소드는 연결이 닫힘(closed) 상태일 때에도 사용할 수 있어서 언제 연결을 설정할 수 있을 지를 알 수 있다.

알려진 한계:

DBMS 설명
Advantage Database 로컬 자유 연결 (local free connection)을 지원하지 않음
dbExpress bridge driver
  • FireDAC에서 ekServerGone을 탐지하지 못할 수 있음
  • Ping 메소드를 지원하지 않음
Informix DirectExecute를 True로 지정해야만 함
Microsoft Access 지원하지 않음
MySQL 네트워크 연결을 잃어버렸을 때 호출 지연을 최소화 하려면, 연결 정의 파라미터 중 ReadTimeout과 WriteTimeout 조정을 고려한다. 
ODBC bridge driver
  • FireDAC에서 ekServerGone을 탐지하지 못할 수 있음
  • Ping 메소드를 지원하지 않음
SQLite 지원하지 않음

 

2 연결 복구 제어하기 (Controlling Connection Recovery

자동 연결 복구를 활성화하려면, ResourceOptions.AutoReconnect를 True로 지정한다. 원한다면, TFDCustomConnection의 이벤트 핸들러를 사용한다.

  • OnRecover - 연결 분실(connection lost) 이벤트에 반응하고, FireDAC이 수행할 다음 액션(action)을 제공한다.
  • OnLosted - 연결 분실(connection lost)이 발생되고 회복되지 않았을 때 발생된다.
  • OnRestored - 연결 분실(connection lost)이 발생되고 회복되었을 때 발생된다.

TFDCustomConnection.OnRecover 이벤트 핸들러에서는 연결을 다시 설정하도록 대응하기, 또는 오프라인 모드로 전환하기, 또는 그냥 연결을 닫아 버리기 등의 대응을 할 수 있을 것이다. OnRecover가 지정되어 있지 않고 비어있으면, FireDAC은 연결을 다시 설정하려고 시도한다.

예문:

procedure TForm1.FDConnection1Recover(ASender: TObject;
  const AInitiator: IFDStanObject; AException: Exception;
  var AAction: TFDPhysConnectionRecoverAction);
var
  iRes: Integer;
begin
  iRes := MessageDlg('연결이 끊겼습니다. 오프라인 - Yes, 다시 시도 - OK, 실패 - Cancel을 클릭하세요.',
    mtConfirmation, [mbYes, mbOK, mbCancel], 0);
  case iRes of
  mrYes:    AAction := faOfflineAbort;
  mrOk:     AAction := faRetry;
  mrCancel: AAction := faFail;
  end;
  Log('연결 복구 중');
end;

OnRecoverOnLostOnRestored 이벤트 핸들러 안에서는 FireDAC manager를 닫기(close) 하지 않기를 강력히 권한다. 자칫 예상치 못한 문제를 유발할 수 있다. 

3 애플리케이션에서 대비하기 (Preparing the Application)

연결이 복구되면 다음 상태들을 잃게 된다.

설정할 옵션 다음 값을 지정
FetchOptions.Mode fmAll
FetchOptions.RowsetSize 200 - 300
FetchOptions.AutoClose True (기본값)
TxOptions.AutoCommit True
ResourceOptions.AutoReconnect True

오프라인 연결 모드캐시된 업데이트에서 활용할 수 있다.

4 기타 자료 (See Also) 

 

 

 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

 공유하기

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.