2013-06-08 10 views
0

, 나는 기본적으로 게으른 관계를 가지고있다. 내가 쿼리를one-to-many 연관 최대 절전 모드 :</p> <pre><code>class Author{ String name static mapping = { books lazy:false } } </code></pre> <p>나는 저자를 가져 오는 기준 API 쿼리가 : 부속 또는 Grails 애플리케이션에서 열망

Author.createCriteria().list{ 
    eq("name", "John") 
} 

을 실행하면 내가 각 저자에 대한 N + 1 개 부속 선택이있다. 열망 단지 같은 책을 가져 오기에

내 두 번째 방법은 다음과 같습니다

Author.createCriteria().list{ 
    eq("name", "John") 
    fetchMode("books", FetchMode.JOIN) 
} 

를이 경우, N + 1 선택 문제는 그러나 나는 가입 쿼리가 표시되지 않습니다.

어떤 접근 방식이 성능 및 최적화면에서 더 낫습니까?

답변

0

질문의 첫 번째 줄에 lazy 대신에 eager이 기본값이라고 생각합니다.

포인트가
이 협회는 기준 쿼리에 포함 할 때 기억해야 할, 그들은 기본적 열심히 페치에 의해입니다.

귀하의 경우 books lazy:falseAuthor에 매핑 할 필요가 없습니다. 나는 아래의 접근을 보증 할 최적화의 측면에서
: 나는 20000 개 블로그를 쓴 한 각 저자가 있다면 내가 하지 위의 접근 방식으로 갈 것 성능면에서

class Author { 
    String name 
    static hasMany = [books: Book] 
    static mapping = { 
     //books lazy:false (DO NOT NEED) 
    } 
} 

class Book { 
    String bookName 
    //set belongsTo if you need bi-directional one-many 
    //books gets cascade deleted when author is deleted 
    //static belongsTo = [author: Author] 
} 

//Bootstrap 
def author1 = new Author(name: "Dan Brown") 
def book1 = new Book(bookName: "Da Vinci Code") 
def book2 = new Book(bookName: "Angels And Demons") 
def book3 = new Book(bookName: "Inferno") 

[book1, book2, book3].each {author1.addToBooks(it)} 
author1.save(flush: true, failOnError: true) 

//Criteria 
Author.createCriteria().list{ 
    eq("name", "Dan Brown") 
    books{ 
     //books are eagerly fetched by default using inner join. No need to specify FetchMode. 
    } 
} 

(책을 대체 블로그와 함께). 20000 개의 블로그를 n 명의 작성자를 대상으로 열심히 가져 오는 것은 실적이 좋습니다. 이 경우에는 게으른 가져 오기 (N + 1) 경로를 찾아 내 요구 사항에 따라 블로그를 필터링하려고합니다. 아래처럼 뭔가 : 당신이 그런 (블로그 케이스) 케이스가없는 경우

def author = Author.findByName("Dan Brown") 
def books = author.books 
//Assume you have a field publishedYear in Book 
def booksReleasedIn2013 = author.books.findAll{it.publishedYear == 2013} 
def booksReleasedBefore2013 = author.books.findAll{it.publishedYear < 2013} 

assert "Inferno" in booksReleasedIn2013*.bookName 
assert "Angels And Demons" in booksReleasedBefore2013*.bookName 

, 그때 최적화성능 모두 위의 인용 된 예를 사용합니다.