앞에 나온바와 같이 Query의 실행이라는 기본목적외에도 현실에는 여러가지 일들이 있다. 그래서 각각의 일들을 해주는 Servant(하인)들이 있다. 단지 본래의 일(Query의 실행)에 영향을 주어서는 안되기 때문에 별도의 쓰레드로 관리된다. 모든 쿼리는 실행이 완료되면 IQueryable객체와 걸린시간정보를 묶은 AfterTask를 Channel에 넣어두고 종료된다. ServantChannel에 AfterTask를 등록한 시점에서 DC는 더이상 관여하지 않는다.
여러개의 Servant는 Chain 형태로 연결되어 있다. 체인의 가장 선두가 Channel에 새로운 AtferTask가 등록되면 가져와서 isDealWith로 자신이 할일인지 판단하여 자신의 작업을 한후 nextServant에게 Task를 전달해준다. Servant는 별도의 Thread로 등록되어 있기 때문에 dc의 작업에 아무런 영향도 끼치지 않는다.
FileServant :
설정된 시간보다 느린 모든 타입(Command, Procedure, Batch 등등)의 쿼리를 잡아서 특정 파일에 기록을 남긴다.
NoneServant :
아무 일도 하지 않는다. Null Object Pattern.
StdOutServant :
특정 타입의 쿼리가 실행될때 걸린 시간등의 정보와 함께 화면에 출력한다.
TraceOfLateProcServant :
설정된 시간보다 느린 모든 타입(Command, Procedure, Batch 등등)의 쿼리를 잡아서 특정 테이블에 기록을 남긴다. 로그파일보다 Table에 기록을 남기면 좀 더 편하게 문제점을 분석할 수 있다.
다이어 그램이 Thread때문에 복잡해지긴 했지만 그닥 어렵지도 않고 특별한 의미를 가진 부분도 아니다.
단 Servant는 프레임워크의 확장 포인트의 일부이고 시스템을 새로 시작하지 않아도 런타임중에 새로운 Servant의 등록과 삭제가 가능하기때문에 여러가지로 응용이 가능하다. 이를테면 XML 파일에 설정된 쿼리가 실행될때 특정 사용자에게 메일을 보내도록 하는 Servant도 있다. 화면 모니터링을 통해 실시간으로 문제 쿼리의 유무를 감시하는데 사용하기도 한다.
'Framework > Database' 카테고리의 다른 글
Framework - 커서(Anonymous) (0) | 2009.03.19 |
---|---|
Framework - 커서(Keyset, Dynamic) (0) | 2009.03.13 |
Framework (DBController) (0) | 2009.03.12 |
Framework -커서(ForwardOnly, Sensitive(=Static)) (0) | 2009.03.12 |
Framework (Handler) (0) | 2009.03.08 |