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

[DocWiki 번역] 데이터베이스 알림 (FireDAC)


Recommended Posts

Docwiki에 있는 "Database Alerts (FireDAC)"을 번역한 글: 번역일: 2022년 4월 3일)

위로 가기: [DocWiki 번역] 명령(command)을 가지고 작업하기 (FireDAC)

알림(alert)은 이름으로 식별하며 아규먼트(argument)들을 포함할 수 있다. 클라이언트는 알림(alert)을 등록한다. 여러 클라이언트에서 알림(alert) 하나를 등록할 수도 있고, 한 클라이언트에서 알림 여러 개를 등록할 수 있다. 데이터베이스에서 알림 신호가 발생되면, 등록된 모든 클라언트에서 공지를 받게 된다. 알림(alert)을 더이상 사용하지 않으면, 애플리케이션에서 알림을 해지한다.

알림(alert)을 활용하느 전형적인 사례들:

  • 테이블 안에서 데이터가 변경되었을 때: 이 경우, 애플리케이션은 이 테이블의 데이터를 반환하는 데이터셋(dataset)을 새로고침한다.
  • 데이터가 충족하는 몇가지 조건을 알려줄 때. 
  • 다른 애플리케이션에서 알려주어서, 특정 애플리케이션에서 특정 작업을 수행하도록 할 때. 예를 들어 데이터 아카이빙(archiving) 또는 백업(backup) 등의 작업

각 DBMS별로 저마다 고유한 DBMS 알림(alert)를 구현하고 있다. 알림(alert) 매터니즘은 특별한 표준이 없다.

 

목차


1 TFDEventAlerter를 사용하기

FireDAC에는 알림(alert) API를 일원화(unify)하는 컴포넌트인 TFDEventAlerter가 있다. 몇몇  DBMS는 DBMS 알림 매커니즘 몇가지를 구현할 수 있다. TFDEventAlerter 오브젝트 하나는 알림(alert) 여러 개에 귀 기울일 수 있는데, 수실하려는 알림의 이름을 TFDEventAlerter.Names 프로퍼티에 명시하고,  Options.Kind 프로퍼티에 지정한 단일 매커니즘을 이용한다.

FireDAC은 해당 데이터베이스에 프라이빗(private) 연결을 별도로 추가하고 백그라운드 쓰레드를 통해 알림들에 귀를 기울인다. FireDAC은 TFDEventAlerter마다 추가 연결 하나를 자동으로 생성한다. 애플리케이션에서 TFDEventAlerter 오브젝트 여러 개를 사요하려면 성능 향상을 위해 연결 풀링 사용을 고려하는 것이 좋다.

이벤트 알림 받기를 시작하려면, TFDEventAlerter.Names 프로퍼티에 원하는 이벤트 이름들을 채워 넣는다. Options.Kind 에는 이벤트 알림 제공자 유형을 지정하거나 또는 (기본 제공자가 사용되도록) 그냥 비워둔다. OnAlert에는 이벤트가 발생될 때 작동하게 될 이벤트 핸들러를 명시한다. 그리고  ActiveTrue로 지정하거나 Register 메소드를 호출한다. 알림 수신을 중지하려면,  ActiveFalse로 지정하거나 Unregister 메소드를 호출한다.

OnAlert 이벤트 핸들러는 메인 쓰레드 또는 백그라운드 쓰레드 문맥 안에서 호출할 수 있다. 이것을 제어하려면, Options.Synchronize 프로퍼티를 사용한다.

주의: 애플리케이션에서 백드라운드 쓰레드 핸들러가 실행되는 시간은 최소화하는 것이 좋다.

애플리케이션에서 알림 시간 제한(timeout)을 지정하려면,  Options.Timeout 프로퍼티를 사용한다. 지정된 시간 안에 알림이 없으면 OnTimeout 이벤트 핸들러가 호출된다.

예를 들어, Oracle 데이터베이스의 "DBMS_ALERT" 매커니즘과 Firebird 표준 매커니즘을 사용하는 "Customers" 알림(alert)을 등록하려면, 다음과 같이 코드를 작성한다.

FDEventAlerter1.Names.Clear;
FDEventAlerter1.Names.Add('Customers');
case FDConnection1.RDBMSKind of
  mkOracle:    FDEventAlerter1.Options.Kind := 'DBMS_ALERT';
  mkInterbase: FDEventAlerter1.Options.Kind := 'Events';
end;
FDEventAlerter1.Options.Synchronize := True;
FDEventAlerter1.Options.Timeout := 10000;
FDEventAlerter1.OnAlter := DoAlert;
FDEventAlerter1.OnTimeout := DoTimeout;
FDEventAlerter1.Active := True;

// …

procedure TForm1.DoAlert(ASender: TFDCustomEventAlerter;
  const AEventName: String; const AArgument: Variant);
begin
  if CompareText(AEventName, 'Customers') = 0 then
    qryCustomers.Refresh;
end;

procedure TForm1.DoTimeout(ASender: TObject);
begin
  // …
end;

서버 쪽 코드: Oracle

CREATE OR REPLACE TRIGGER TR_CUSTOMERS
AFTER INSERT OR UPDATE OR DELETE ON CUSTOMERS
BEGIN
  SYS.DBMS_ALERT.SIGNAL('Customers', '123');
END;

서버 쪽 코드:  Firebird

CREATE TRIGGER TR_CUSTOMERS FOR CUSTOMERS
ACTIVE AFTER INSERT OR UPDATE OR DELETE
BEGIN
  POST_EVENT 'Customers';
END;

 

2 DBMS 알림 매커니즘 (DBMS Alert Mechanisms)

앞에서 설명한 바와 같이, 각 DBMS별로 저마다 고유한 DBMS 알림(alert)를 구현하고 있다. 변경(alter)  매커니즘 유형은 TFDEventAlerterOptions.Kind 프로퍼티 값에 의해 식별된다. 만약 비어두면, 기본 매커니즘이 사용된다. 매커니즘 대부분에서 클라이언트 쪽의 기능은 동일하며, 단지 데이터베니스 쪽 기능만 다르다.

아래 표는 FireDAC 드라이버들이 지원하는 각 DBMS 별 alter(알림자)의  매커니즘이다.

(역자 주: 표는 번역을 생략합니다. 여기를 눌러서 원문을 참고하세요)

 

3 기타 자료 (See Also)

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

  • Kori changed the title to [DocWiki 번역] 데이터베이스 알림 (FireDAC)

이 토의에 참여하세요

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

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...

중요한 정보

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