2010-05-12 3 views
4

중간 Java 응용 프로그램을 개발 중이며 경험 부족으로 인해 작은 문제에 직면하고 있습니다.Java DAO 캐싱

데이터베이스에서 "아티클"개체를 가져 오는 사용자 지정 DAO가 있습니다. 나는 Article 클래스를 가지고 있고 DAO는 getArticle(int id)이라는 메서드를 가지고 있습니다.이 메서드는 Article을 반환합니다. Article에는 Category 개체가 있고 지연로드가 사용됩니다.

따라서 기사 카테고리 (Article a = new Article(); a.getCategory();)를 요청하면 Article 클래스는 DAO에서 Category을 가져온 다음이를 반환합니다.

이제 캐시 할 생각입니다. 기사의 카테고리에 여러 번 요청하면 데이터베이스는 한 번만 쿼리됩니다.

내 질문 : 캐시를 어디에 두어야합니까? 나는 DTO의 Article 클래스에 넣을 수 있거나 DAO 클래스에 넣을 수 있습니다.

뭐라고 말합니까?

답변

8

내 질문은 어디에 넣어야합니까? 캐시는 어디에 넣어야합니까? 나는 (DTO에서) 기사 클래스에 넣을 수 있습니다. 아니면 을 DAO 클래스에 넣을 수 있습니다.

다른 언급처럼, 실제로 휠을 다시 발명하는 것처럼 들립니다. ORM이 어떻게 작동하는지 더 잘 이해할 수 있도록 두 가지 경우를 모두 고려해 봅시다.

범주를 저장하면 다른 범주에서 액세스 할 경우 동일한 범주가 반복적으로로드됩니다.

getCategory() { 
    if(category == null) { category = <load from DAO> } 
    return category; 
} 

만약 그런 다음 같은 카테고리의 모든 기사 캐시를 혜택의 DAO에 보관하지만, 당신이 카테고리가 변경 될 때뿐만 아니라 캐시를 업데이트하는데주의를 기울여야 할 필요가있다. 이 방법

saveCategory(Category c) { 
    cache.put(c.id, c); 
    <save in database> 
} 

문제는 시간 제한 메커니즘 또는 방법이없는 경우 (1) 캐시가 시간이 지남에 따라 커질 수 있음을, (2) 데이터베이스의 외부 업데이트가 반영되지 않을 것입니다 캐시를 지울 수 있습니다.

  1. 엔티티 자체 :

    사실, 하이버 네이트와 같은 ORM 캐싱의 세 가지 수준이있다. 카테고리가 지연로드되면 후속 직접 액세스를 위해 기사 엔티티에 저장됩니다.

  2. 첫 번째 레벨 캐시. 이것은 현재 세션/트랜잭션의 캐시입니다. 동일한 엔티티는 두 번로드되지 않지만 캐시에서 가져옵니다.
  3. 2 차 레벨 캐시. 이것은 모든 세션/트랜잭션의 캐시입니다. 이는 DAO에서 값을 캐싱하는 옵션에 해당합니다. 2 레벨 캐시는 위에서 언급 한 이유 때문에 때로는 더 까다 롭습니다.

각 유형의 캐시의 단점/이점을 더 잘 볼 수 있기를 바랍니다. 자세한 내용은 자주 사용되는 ORM 설명서를 참조하십시오. 이 문제는 일반적으로 잘 기록되어 있습니다.

+0

고마워요. 이건 정말 건축가 답입니다. 나는 Hibernate를 알고, 나는 실제로 JPA를 사용하지만, 나는 Hibernate를 사용했다. 나는 혼자서하려고 애쓰는 중이 야. 취미 같이. 엔티티 및 2 수준 캐시를 사용하고 일부 관찰자와 시간 초과가 있다고 생각합니다. 형제 다시 고마워! – santiagobasulto

8

Hibernate을 사용해 보셨나요?

+0

정확하게, 바퀴를 재발 명할 필요가 없습니다. 스스로 일종의 캐시를 구현하는 것은 재미있는 일이지만, 애플리케이션을 작동시키고 싶다면 Hibernate로 가라. 자동 캐싱을 처리 할 수있는 기능을 갖추고 있으며, 업계 표준 ORM 프레임 워크를 사용하여 귀중한 경험을 얻을 수 있습니다. –

+1

사전 제작 된 솔루션을 제안하는 경우 원본 질문 (이 경우 데이터 캐싱)과 어떻게 작동하는지 간략하게 설명하는 것이 좋습니다. 내 대답을 보라. – ewernli

2

DAO의 목적은 지속성 메커니즘을 추상화하는 것입니다. 카테고리는 (DB, 디스크상의 파일, 네트워크 소켓, 캐시)에서 오는 카테고리가 그 지속성 메커니즘의 일부이기 때문에, DAO는 이것을 소비하는 객체에서 '숨겨'야합니다.

0

귀하의 Article이 DAO에 직접 액세스 할 수 있는지 여부에 따라 달라집니다.

개인적으로 나는 모든 사람들이 DAO를 사용하여 캐싱을 원한다는 단순한 사실 때문에 Article에 캐싱을 구현할 것입니다. 또한 하나의 클래스가 하나의 일을하고 하나의 일을하는 관점에서, 당신은 이미 게으른 로딩을 가지고 있기 때문에 Article DAO에서 로딩이 일어나는 부분을 옮기는 것은 의미가 없다.

3

최대 절전 모드 또는 더 단순한 형식 (JPA)