복잡한 쿼리를 DB에서 처리할경우 어느 정도 시간이 걸립니다.
저희 개발서버에 있는 DB에도 데이터 건수가 많은 관계로 복잡한 쿼리를 수행하면
결과 표출까지
7~8분 많게는 10분 넘게 걸리는경우가 많습니다.
이런 쿼리를 기준으로 DB 조회 프로그램을 설계할 때 보통 쓰레드를 많이 쓰지않나요?
저에게는 다음과 같은 고민이 있습니다.
DB환경:오라클/ 컴포넌트 환경: TSQLQuery
TSQLQuery가 OPEN 된 시점에서는 대기상태가 됩니다. 즉 엑세스가 불가능하죠.
이 때 수행하는 쿼리가 복잡하다면 대기상태는 더 길어지고 사용자는 지루해 하며, 쿼리를 취소하고 싶어질 것입니다.
일단 TSQLQuery가 메인폼에 있다면 MainForm이 얼어버리는 관계로 일단은 TSQLQuery를 쓰레드에 위치시켰습니다.
사용자가 쿼리수행명령을 내리면 쓰레드가 생성되고 TSQLQuery가 동적생성이 되어서 쿼리를 수행합니다.
하지만 사용자는 쿼리 결과가 한참이 지나도 안나오자 수행중이던 쿼리를 중지 시키고 싶어 합니다.
이럴때는 머 TSQLQuery가 Open이 끝나는 시점이 되면 쓰레드는 종료되는 관계로 쓰레드 종료 이벤트에서 처리하면 되지요. 그리고 쓰레드가 종료될 때 동적할당한 TSQLQuery를 해제하는겁니다.
여기까지는 문제가 없습니다만.
제가 고민이 되는 부분은 바로 쿼리가 쓰레드에서 수행중인 시점에서 사용자가 프로그램 종료 할 때 입니다.
지금 쓰레드에서 수행중이던 쿼리가 언제 완료될지도 모르는데 사용자는 이미 프로그램 종료 명령을 내린 상태에서
쿼리 수행이 끝이 나길 마냥 기다릴 수 없는 상황입니다.
쓰레드는 강제종료 후 프로그램을 종료 할 수 있지만 그렇게 되면 동적 할당 된 TSQLQuery는 해제 할 수 없게 됩니다.
음 제가 개발경험이 적다보니 이런 고민을 하게 되네요.
어떤 방향으로 가야 사용자 편의와 메모리관리가 잘 이루어지는 프로그램을 만들수 있을까요?
많은 조언부탁드립니다.
|