2014-12-16 3 views
0

MySQL 상위에서 실행되는 Tomcat-Spring-JPA 서비스가 있습니다.서버 측 보고서가 너무 많은 메모리를 차지할 위험을 줄이는 가장 좋은 방법

우리 서비스의 일부는 리포트 기능입니다. 우리는 서로 다른 크기의 서로 다른 고객을 보유하고있어 서로 다른 양의 데이터를 보유하고 있습니다. 그들이 보고서를 실행하면

, 그들은, 날짜 및 기타 다양한 매개 변수를 선택하여 서버에 전송하고, 서버는 PDF 년대, XLS 시트 등을 만들어

우리는 염려했다

그들이 어떤 날짜 기간을 선택할 수 있다면 수 있음 너무 많은 메모리를 차지하므로 일부 견적을 작성하고 보고서의 최대 기간을 생각해 냈습니다.

이것은 여러 가지 이유로 최적이 아니므로 시간이 많이 남았으므로 대안을 찾고 있습니다.

내가 지금까지 생각 해낸 가장 좋은 점은 기본적으로 "최대 개수"행을 갖는 것입니다. 즉, 모든 매개 변수가있는 쿼리의 개수 (*)를 계산하고 너무 많은 데이터가 있으면 사용자에게 알려줍니다 그들은 기간을 줄여야합니다.

는 그래도 난 문제의 몇 가지를 가지고, 어떤 피드백을 바라고 :

  1. 카운트 (*)는 자체는 꽤 많은 메모리를 차지하지 것인가?
  2. 내가 생각하지 못한 더 좋은 방법이 있나요? 메모리의 상당한 양을하지 않습니다
+0

을 생성? 올바른 방법은 보고서를 생성하는 알고리즘을 최적화하려고 시도하는 것이므로 한계가 부적절하게됩니다. – AlexR

+0

얼마나 최적화 했더라도 결국 충분한 사용자가 동시에 실행되면 메모리가 부족해질 위험이 있습니다. 나는 이것을 클라우드 서비스로 (아직) 실행하지 않고 있으므로 오버 헤드를 줄이고 가능한 위험을 감수하려고 노력합니다. 당신이 내가 어디에서 왔는지 보길 바랍니다. – Mathias

+0

메모리 집약은 구현에 따라 다릅니다. 당신은 80 억 명의 사람들이 귀하의 응용 프로그램을 사용하여 시간당 10 년 보고서를 생성하기 시작한다면 당신은 기억 문제를 경험하게 될 것입니다.그러나 나는 사용자가 적다는 것을 추측합니다. 따라서 보고서 생성 메커니즘에 대한 분석이 메모리 문제를 피하는 데 도움이 될 수 있습니다. – AlexR

답변

0
  1. 카운트 (*)를 (나는 그들이 보고서를 실행하는 경우가 모든 데이터를 얻을 기대, 페이징 또는 유사한 싶지 않아) .

  2. 데이터 양을 줄이려면 시간 범위를 정의하십시오. 예 : 선택한 간격이 15 일 미만이면 보고서 시간 간격은 일입니다. 간격이 보고서의 시간 간격이 간격이 100 일 이상하지만, 200 미만 일 경우 WEEK

    인 15 일 이상하지만, 100 미만 일 경우

보고서의 시간 간격은 MONTH

입니다 간격이 보고서의 시간 간격이 올해 500 개 이상의 일 경우

간격 이상 2백일 미만 500 일 보고서 시간 간격 인 경우 는 QARTER

입니다. 보고서의 행 따라서 양

은 항상 합리적이다하지만 사용자가 더 깊은 약간의 간격을 조사 할 경우보다 짧은 기간을 선택하고 자세한 보고서

당신이 _why_가 report_ 세대가 너무 많은 메모리를 필요로 분석하려고 했