2009-03-17 4 views

答えて

16

基本的に遅延ロードは、熱心な代替(パフォーマンス、リソースの使用)よりも多くの利点があります。すべてのリレーション(Grails 1.1以降)のデフォルトのgrails設定であるため、特定の問題が発生しない限り、一般的にはそれをeager fetching用に設定しないでください。異なるのHibernateセッションをaccross

  • がドメインインスタンスを共有する(例えばHTTPセッションスコープにドメインクラスのインスタンスを入れて、そこからプロパティにアクセスするとき - などのユーザーとして。)
  • ドメインにアクセスするときLazyInitializationExceptionを取得する次のようなレイアウト/ビュー内のクラスインスタンス
  • 確かに、インスタンスがフェッチされるたびに特定のリレーションプロパティにアクセスします。また、このリレーションをeagerフェッチ用にコンフィグレーションすることも意味があります。

巨大なデータベースを扱う場合、Eagerの取得は非常に危険です。このように、ドメインクラスを想像してみて:

// really bad example 
class TreeNode { 

    String name    

    TreeNode parent 

    static hasMany = [ childNodes: TreeNode ] 

    static mapping {  
     parent lazy: false 
     childNodes lazy: false 
    } 

} 

あなたはTreeNodeのインスタンスのいずれかを読んだとき、それは自動的にメモリにデータベースからドメインクラスの他のすべてのインスタンスを引っ張ってきます。十分なインスタンスがある場合は、おそらくインスタンスを1つだけ取得してアプリケーションを終了させます。

関連する問題