簡體   English   中英

Grails / GORM域保存 - 瞬態對象變通方法

[英]Grails/GORM domain saving - transient object workaround

我找到了解決問題的方法,我想知道它是否有效。 這是一個類似的問題: Grails Gorm:Object引用一個未保存的瞬態實例

讓我們假設我有兩個域對象(名稱已更改以保護有罪)。

public class Shelf {
    String name
    Set<Book> books = [] as Set

    static hasMany = [books: Book]
}

public class Book {
    String title
    Shelf shelf
}

所以這意味着1個書架包含0到多本書,而一本書只能在一個書架上。

這個架子非常大。 在某些時候,它包含80,000本書。 全部存儲在DB中。 當然,添加新書變得越來越慢。

這是通過:

  Book book1 = new Book("Awesome Title")
  existingShelf.addToBooks(book1)
  existingShelf.save(flush: true)      // super slow

這很慢。 主要是(我假設),因為GORM必須確認其他80,000條記錄。

所以我這樣做試圖解決慢點問題。

  Book book2 = new Book("Awesome Title 2")
  book2.save(flush: true)

這給了我一個“對象引用一個未保存的瞬態實例”,我認為這是有道理的 - “架子”值是空的。

所以我做了一些有點奇怪的事情:

  Book book3 = new Book("Awesome Title 3")
  book3.shelf = new Shelf()
  book3.shelf.id = <known/valid id here>
  book2.save(flush: true)

這有效。 它節省了。 沒有參考錯誤。 依賴於此的進一步代碼......有效。 我剛剛撥打電話,持續了幾分鍾,並將其縮短為秒。 但這似乎太容易了。 我敢肯定我是如何在Grails魔術周圍工作的。 並且可能在此過程中破壞了一些東西

建議嗎? 解釋嗎?

是的,使用addTo *方法可能會很慢。 如果你看一下生成的SQL,你就會明白為什么。 執行以下操作:

new Book(title: "GORM Performance", shelf: grailsShelf).save()

會更快,技術上沒有任何問題。 請注意,在您從數據庫刷新集合之前,您的grailsS​​helf.books實例不會包含新書。 這是addTo *方法為您所做的一部分。

邊注:

Set<Book> books = [] as Set

沒必要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM