Kori 4월 3일, 2022에 포스트됨 공유하기 4월 3일, 2022에 포스트됨 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를 사용하기 2 DBMS 알림 매커니즘 (DBMS Alert Mechanisms) 3 기타 자료 (See Also) 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에는 이벤트가 발생될 때 작동하게 될 이벤트 핸들러를 명시한다. 그리고 Active를 True로 지정하거나 Register 메소드를 호출한다. 알림 수신을 중지하려면, Active를 False로 지정하거나 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) Multithreading TFDEventAlerter 예제 애플리케이션 인용하기 이 댓글 링크 다른 사이트에 공유하기 더 많은 공유 선택 사항
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.