Close() 메서드를 사용하여 보고서 제거
Crystal Reports for Visual Studio 프로젝트의 확장성을 최적화하는 방법에는 사용 가능한 여러 Close() 메서드 중 하나를 통해 보고서에서 사용되는 메모리를 해제하는 방법도 있습니다.
사용 가능한 두 가지 Close() 메서드는 다음과 같습니다.
- Crystal Reports에서 사용되는 ReportDocument.Close()
- RAS SDK에서 사용되는 ReportClientDocument.Close()
ReportDocument.Close() 메서드
Crystal Reports for Visual Studio를 사용할 경우 reportdocument.close() 메서드를 통해 Crystal 보고서가 웹 서버에서 소모하는 메모리를 해제할 수 있습니다.
ReportDocument.Close() 메서드에 액세스하는 방식은 보고서의 포함 여부에 따라 달라집니다.
- 보고서가 포함되었으면 코드에 보고서를 나타내도록 보고서 래퍼 클래스가 생성됩니다. 이 보고서 래퍼 클래스는 ReportDocument에서 상속하며 Close() 메서드는 상속에 의해 액세스됩니다.
- 보고서가 포함되지 않았으면 보고서는 파일 디렉터리에서 ReportDocument 인스턴스로 로드되고 Close() 메서드는 ReportDocument 클래스에서 직접 액세스됩니다.
참고
포함 보고서 및 비포함 보고서에 대한 자세한 내용은 "포함 및 비포함 보고서 비교"를 참조하십시오.
Crystal 보고서 및 ReportDocument 인스턴스는 모두 각각 메모리를 소모합니다. 메모리에서 ReportDocument를 해제해도 보고서는 계속해서 메모리를 사용합니다.
예를 들어, 웹 페이지에서 로드가 완료되면 ReportDocument 인스턴스는 범위를 벗어납니다. .NET의 가비지 수집을 통해 ReportDocument 인스턴스가 정리되면 ReportDocument 인스턴스에서 사용한 메모리가 웹 서버에서 해제됩니다.
그러나 보고서 자체는 웹 서버의 메모리에 남게 됩니다. 보고서에 액세스하는 ReportDocument 인스턴스가 더 이상 존재하지 않으므로 보고서는 제거되지 않습니다. 이러한 상황이 여러 번 반복되면 웹 서버의 메모리는 더 이상 액세스되지 않는 보고서로 가득 차게 됩니다.
이 문제를 해결하려면 ReportDocument.Close() 메서드를 호출합니다. 그러면 보고서 자체가 웹 서버에서 닫히고 이후 보고서를 위해 메모리가 해제됩니다.
ReportDocument.Close() 메서드 호출 시기
보고서가 닫혀도 다시 참조되면 ReportDocument가 보고서를 다시 열기 때문에 보고서가 표시되기 전에 페이지에서 ReportDocument.Close() 메서드를 호출하면 안 됩니다. 표시 프로세스가 완료된 후에만 Close() 메서드를 호출해야 합니다.
Close() 메서드를 호출하기에 가장 적절한 시기는 Page_Unload 이벤트가 실행 중일 때입니다.
ReportClientDocument.Close() 메서드
관리되지 않는 RAS 또는 관리되는 RAS 서버를 사용할 경우 보고서는 보고서 응용 프로그램 서버에 저장되지만 ReportClientDocument의 인스턴스를 통해 웹 서버에 표시됩니다. ReportClientDocument 인스턴스가 ReportClientDocument.Close() 메서드를 호출하지 않고 범위를 벗어나면 보고서에 더 이상 액세스할 수 없는 경우에도 보고서 응용 프로그램 서버는 메모리에 보고서를 열어 둡니다. 이러한 상황이 여러 번 반복되면 보고서 응용 프로그램 서버의 메모리는 웹 서버에서 더 이상 액세스되지 않는 보고서로 가득 차게 됩니다.
이 문제를 해결하려면 ReportClientDocument.Close() 메서드를 호출합니다. 그러면 보고서가 보고서 응용 프로그램 서버에서 닫히고 이후 보고서를 위해 메모리가 해제됩니다.
ReportClientDocument.Close() 메서드 호출 시기
표시 프로세스가 완료될 때까지는 서버에서 보고서가 열린 상태로 유지되어야 하므로 보고서가 표시되기 전에 페이지에서 Close() 메서드를 호출하면 안 됩니다.
ReportClientDocument 인스턴스의 경우 Close() 메서드를 호출하면 보고서가 즉시 닫히고 보고서를 다시 열 수 없게 됩니다. 따라서 보고서가 표시되기 전에 Close() 메서드를 호출하면 보고서에 액세스할 수 없게 되고 예외가 throw됩니다.
Close() 메서드를 호출하기에 가장 적절한 시기는 Page_Unload 이벤트가 실행 중일 때입니다.