2012-08-14 4 views
2

내 코드는 때때로 다소 수다스러운 방식으로, DB 쿼리를 많이한다 : 위의 코드 만 특별 관리 페이지에서 호출Play Framework 용 쿼리 최적화 레이어를 작성하는 일반적인 방법은 무엇입니까?

// Process all users: 
for (User u : users) { 
    // multiple queries per single user 
    w = Website.find("owner = ?", u.id); 
    d = Demo.find("..."); 
    ... 

} 

, 그래서 슈퍼 빠른 될 필요가 없습니다,하지만 난 ' 합리적인 성능을 얻고 싶습니다. 완전히 다시 작성하지 않고이를 수행 할 수있는 일반적인 방법이 있습니까?

내가 상상하는 것은 같은 물건을 할 수있는 재생 모듈은 다음과 같습니다

이와 같은
// Preprocess - warm cache 
Website.findAll(); 
Demo.findAll(); 

// After the above code was run, all the data is cached in the scope of this request, so 
// the following code should now not do any fetches to the database 

// Process all users: 
for (User u : users) { 
    // multiple queries per single user 
    w = Website.find("owner = ?", u.id); 
    d = Demo.find("..."); 
    ... 

} 

그것을 시도하고 최적화 층을 구축하는 것이 맞습니까? 어떻게 접근할까요?

이점은 필자가 보았 듯이 프로토 타이핑 단계에서 "바보 같은 코드 작성"을 할 수있게 해주고 필요시 적절한 수준으로 쉽게 최적화 할 수 있다는 것입니다. 물론 최적의 성능에 도달하지 못하고 실제로 큰 테이블에서는 작동하지 않지만 특정 작업에서는 유용 할 수 있습니다.

또는 ... "마법의"캐시 계층에 의존하지 않고 대신 코드를 처음부터 다시 작성해야합니까?

답변

1

Hibernate는 2 차 레벨 캐싱을 활성화하는 몇 가지 옵션을 가지고 있지만 그렇게하는 것은 쉽지 않습니다. 캐싱을 사용해야하는 경우에는 캐싱을보아야합니다.

개요 및 자세한 내용은 http://www.ehcache.org/documentation/user-guide/hibernate (Ehcache 옵션)에 대한 내용은 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-cache을 참조하십시오.

물론 이것은 Admin-backend 코드뿐만 아니라 모든 DB 액세스에도 영향을 미칩니다.

이것은 캐싱을 구현하는 대신 코드를 조정하는 것이 좋습니다.

1

최대 절전 모드 2 단계 캐시는 재생과 함께 기본적으로 사용되지 않습니다. 성능을 향상시켜야 할 경우 재생 캐시를 직접 사용할 수 있습니다. 데이터가 캐시에 존재하지 않을 수 있으며이를 놓치지 않고 가져올 필요가 있음을 명심하십시오.

캐싱의 메모리 비용도 염두에 두십시오.

for (User u : users) { 
    WebSite www = Cache.get("website-"+u.id, WebSite.class); 
    if(www == null){ 
    // multiple queries per single user 
    www = Website.find("owner = ?", u.id); 
    Cache.set("website-"+u.id, www, "1d"); 
    } 
    ... 
} 

나는 그것을 시도하지하지만 두 번째 레벨 캐시를 최대 절전 모드 활성화에 관한 this thread 살펴 적이 없다.

또한 무거운 쿼리에 큰 성능 영향을 줄 수있는 올바른 인덱스를 데이터베이스에 만들어야합니다.

+0

그런 코드를 작성한 경우지도를 사용할 수도 있습니다. 요청의 시작 부분에있는 모든 엔티티를 읽고 Map에서 읽은 다음 요청이 끝나면 Map이 삭제됩니다. 적은 코딩이 필요한 솔루션이 있는지 이해하려고 노력하고 있습니다. – ripper234

+0

Play는 기본적으로지도보다 더 정교한 memcache를 사용합니다. 코드를 변경하지 않고 ehcache를 분산 캐시로 사용할 수도 있습니다. 이것은지도보다 훨씬 더 좋은 옵션입니다. 물론 바퀴를 재발 명하려는 경우 맵을 사용할 수 있고 TTL과 캐시 시스템의 모든 기능을 구현할 수 있습니다. – emt14