2016-10-03 1 views
1

내가 찾고있는 응용 프로그램 중 하나가 ~ 20,000ms가 걸리는이 코드 조각이있다. 이것은 실제로 웹 사이트의 성능을 저해합니다. Criteria.list 때문에 이것이 있습니까? 느린 것을 담당하는 코드는 다음과 같습니다. 테이블의 모든 값을 검색하려고하는 예제 DB 테이블이 있습니다. 이 쿼리의 성능을 어떻게 향상시킬 수 있습니까? 내 데이터베이스로 SQL 서버를 사용하고 있습니다.매우 간단한 쿼리를 위해 Hibernate Criteria.list()가 매우 오랜 시간이 걸린다.

public Map<Integer, Sample> getAllSamples() { 
    Map<Integer, Sample> Sample = transactionTemplate 
      .execute(new TransactionCallback<Map<Integer, Sample>>() { 
       @Override 
       public Map<Integer, Sample> doInTransaction(TransactionStatus arg0) { 
        Criteria criteria = hibernateTemplate 
          .getSessionFactory().getCurrentSession() 
          .createCriteria(Sample.class); 
        criteria.add(Restrictions.isNull("deleted")); 
        @SuppressWarnings("unchecked") 
        List<Sample> Samples = (List<Sample>) criteria.list(); 
        HashMap<Integer, Sample> mSamples = new HashMap<Integer, Sample>(); 
        for (Sample sample: Samples){ 
         if (sample != null && sample.getsampleId() != null){ 
          //hibernateTemplate.initialize(sample); 
          mSamples.put(sample.getsampleId(), sample); 
          hibernateTemplate.initialize(sample.getsampleCountry()); 
         } 
        } 
        return mSamples; 
       } 
      }); 
    return Sample; 
} 

이제 My Sample 클래스에는 Account와 Deposit이라는 두 개의 다른 클래스가 있습니다. 샘플과 다른 두 개의 관계는 일대일 관계입니다. 그러나 fetchType은 lazy입니다. 여기에 내가 로그를 확인

@OneToOne(fetch = FetchType.LAZY, mappedBy = "sample", cascade = CascadeType.ALL) 
public deposit getDeposit() { 
    return this.deposit; 
} 

샘플 클래스의 코드는, 그리고 샘플의 각 행에 대해, 예금에서 생성되는 쿼리가있다. 이것이 사실이 아닌지 어떻게 확인합니까? Sample에는 약 400 행이 있으므로, 입금액을 검색 할 때 400 개의 조회가 실행됩니다. 이것은 이상합니다. 성능 개선을 위해 여기서 무엇을 할 수 있는지 잘 모르겠습니다. 어떤 포인터가 큰 도움이 될 것입니다.

미리 감사드립니다.

+0

단지 열망 페치를 사용 –

답변

0

이것은 내가 한 행동입니다. 연결을 필수로 설정했는데 (optional = false), 모든 샘플 레코드에 대해 Deposit 레코드가 있다는 것을 신뢰합니다. 그러므로 Sample을로드 할 때 Hibernate는 Deposit 테이블을로드하지 않는다.

이 기본 코드,

@OneToOne(optional = false, fetch = FetchType.LAZY, mappedBy = "sample",   cascade = CascadeType.ALL) 
    public deposit getDeposit() { 
     return this.deposit; 
    }