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
将导致hibernate
Set
映射。 但是,为了保持唯一性/顺序,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,谢谢您提供的信息,我将