win*_*nna 3 database grails grails-orm
我找到了解决问题的方法,我想知道它是否有效.这是一个类似的问题:Grails Gorm:Object引用一个未保存的瞬态实例
让我们假设我有两个域对象(名称已更改以保护有罪).
public class Shelf {
String name
Set<Book> books = [] as Set
static hasMany = [books: Book]
}
Run Code Online (Sandbox Code Playgroud)
和
public class Book {
String title
Shelf shelf
}
Run Code Online (Sandbox Code Playgroud)
所以这意味着1个书架包含0到多本书,而一本书只能在一个书架上.
这个架子非常大.在某些时候,它包含80,000本书.全部存储在DB中.当然,添加新书变得越来越慢.
这是通过:
Book book1 = new Book("Awesome Title")
existingShelf.addToBooks(book1)
existingShelf.save(flush: true) // super slow
Run Code Online (Sandbox Code Playgroud)
这很慢.主要是(我假设),因为GORM必须确认其他80,000条记录.
所以我这样做试图解决慢点问题.
Book book2 = new Book("Awesome Title 2")
book2.save(flush: true)
Run Code Online (Sandbox Code Playgroud)
这给了我一个"对象引用一个未保存的瞬态实例",我认为这是有道理的 - "架子"值是空的.
所以我做了一些有点奇怪的事情:
Book book3 = new Book("Awesome Title 3")
book3.shelf = new Shelf()
book3.shelf.id = <known/valid id here>
book2.save(flush: true)
Run Code Online (Sandbox Code Playgroud)
这有效.它节省了.没有参考错误.依赖于此的进一步代码......有效.我刚刚打了一个电话,持续了几分钟,然后把它减少到几秒钟.但这似乎太容易了.我敢肯定我是如何在Grails魔术周围工作的.并且可能在此过程中破坏了一些东西
建议吗?解释吗?
是的,使用addTo*方法可能会很慢.如果你看一下生成的SQL,你就会明白为什么.执行以下操作:
new Book(title: "GORM Performance", shelf: grailsShelf).save()
Run Code Online (Sandbox Code Playgroud)
会更快,技术上没有任何问题.请注意,在您从数据库刷新集合之前,您的grailsShelf.books实例不会包含新书.这是addTo*方法为您所做的一部分.
边注:
Set<Book> books = [] as Set
Run Code Online (Sandbox Code Playgroud)
没必要.
| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |