Performance 当使用Grails时,如何解决潜在的性能问题?
给定以下域类:Performance 当使用Grails时,如何解决潜在的性能问题?,performance,hibernate,grails,groovy,Performance,Hibernate,Grails,Groovy,给定以下域类: class Post { SortedSet tags static hasMany = [tags: Tag] } class Tag { static belongsTo = Post static hasMany = [posts: Post] } 据我目前的理解,使用hasMany将导致hibernateSet映射。 但是,为了保持唯一性/顺序,Hibernate需要从数据库加载整个集合,并比较它们的散列 这可能会导致添加和删除帖子/标签时出现
class Post {
SortedSet tags
static hasMany = [tags: Tag]
}
class Tag {
static belongsTo = Post
static hasMany = [posts: Post]
}
据我目前的理解,使用hasMany
将导致hibernateSet
映射。
但是,为了保持唯一性/顺序,Hibernate需要从数据库加载整个集合,并比较它们的散列
这可能会导致添加和删除帖子/标签时出现严重的性能问题
如果他们的电视机变大了。解决此问题的最佳方法是什么?集合的排序由
集合
实现保证,即分类集合
。除非使用跟踪数据库索引的列表
,否则排序仅限于服务器端
如果您的域类位于SortedSet
中,则必须实现compariable
,以便对集合进行正确排序
性能问题本身并不是一个真正的问题。如果要访问单个
标记
,应通过其Id获取该标记。如果您想要排序的标记,那么,排序只有在您查看所有标记而不是特定标记时才有意义,因此您最终一次检索所有标记。由于排序是在服务器端而不是数据库端执行的,因此在数据库方面,SortedSet
和常规的HashSet
之间实际上没有太大区别。集合的排序是由集合
实现保证的,即SortedSet
。除非使用跟踪数据库索引的列表
,否则排序仅限于服务器端
如果您的域类位于SortedSet
中,则必须实现compariable
,以便对集合进行正确排序
性能问题本身并不是一个真正的问题。如果要访问单个标记
,应通过其Id获取该标记。如果您想要排序的标记,那么,排序只有在您查看所有标记而不是特定标记时才有意义,因此您最终一次检索所有标记。由于排序是在服务器端而不是数据库端执行的,因此在数据库方面,SortedSet
和常规的HashSet
之间实际上没有太大区别。在默认映射中,Hibernate/GORM无法确保顺序。因此,它不必从数据库加载元素来进行排序。你将拥有一堆身份证,但这只是其中的一部分
见19.5.2:
一般来说,Hibernate/GORM的性能将比您预期的更好。除非并且直到您能够证明实际存在的性能问题,否则请信任框架,不要担心它。默认映射中的Hibernate/GORM无法确保顺序。因此,它不必从数据库加载元素来进行排序。你将拥有一堆身份证,但这只是其中的一部分
见19.5.2:
一般来说,Hibernate/GORM的性能将比您预期的更好。除非并直到您能够证明存在真实的性能问题,否则请信任框架,不要担心它。Grails文档似乎已经更新:
在第5.2.4节中,他们讨论了收集类型的潜在性能问题
以下是相关章节:
关于收集类型和性能的说明
Java集合类型是不允许重复的集合。为了确保向集合关联添加条目时的唯一性,Hibernate必须从数据库加载整个关联。如果在关联中有大量条目,这可能会导致性能方面的代价高昂
列表类型也需要相同的行为,因为Hibernate需要加载整个关联以维护顺序。因此,如果您预计关联中会有大量记录,建议您将关联设置为双向,以便可以在反向侧创建链接。例如,考虑下面的代码:
def book = new Book(title:"New Grails Book")
def author = Author.get(1)
book.author = author
book.save()
在本例中,关联链接是由子项(书籍)创建的,因此无需直接操作集合,从而减少查询和提高代码效率。如果一位作者拥有大量相关书籍实例,如果您要编写如下代码,您将看到对性能的影响:
def book = new Book(title:"New Grails Book")
def author = Author.get(1)
author.addToBooks(book)
author.save()
Grails文档似乎正在更新:
在第5.2.4节中,他们讨论了收集类型的潜在性能问题
以下是相关章节:
关于收集类型和性能的说明
Java集合类型是不允许重复的集合。为了确保向集合关联添加条目时的唯一性,Hibernate必须从数据库加载整个关联。如果在关联中有大量条目,这可能会导致性能方面的代价高昂
列表类型也需要相同的行为,因为Hibernate需要加载整个关联以维护顺序。因此,如果您预计关联中会有大量记录,建议您将关联设置为双向,以便可以在反向侧创建链接。例如,考虑下面的代码:
def book = new Book(title:"New Grails Book")
def author = Author.get(1)
book.author = author
book.save()
在本例中,关联链接是由子项(书籍)创建的,因此无需直接操作集合,从而减少查询和提高代码效率。如果一位作者拥有大量相关书籍实例,如果您要编写如下代码,您将看到对性能的影响:
def book = new Book(title:"New Grails Book")
def author = Author.get(1)
author.addToBooks(book)
author.save()
您是否有任何文档/证据表明分拣是在服务器端为分拣集执行的?@Miguel,谢谢您提供的信息,我将