1

给定以下域类:

class Post {
   SortedSet tags
   static hasMany = [tags: Tag]
}

class Tag {
   static belongsTo = Post
   static hasMany = [posts: Post]
}

到目前为止,据我了解,使用 ahasMany将导致休眠Set映射。然而,为了保持唯一性/顺序,Hibernate 需要从数据库中加载整个集合并比较它们的哈希值。

如果帖子/标签的集合变大,这可能会导致添加和删除帖子/标签时出现严重的性能问题。解决此问题的最佳方法是什么?

4

3 回答 3

1

Hibernate/GORM 在默认映射中没有确保顺序。因此,它不必从数据库中加载元素来进行排序。您将拥有一堆 id,但仅此而已。

见 19.5.2: http ://www.hibernate.org/hib_docs/reference/en/html/performance-collections.html

一般来说,Hibernate/GORM 的性能会比您预期的要好。除非并且直到您能够真正证明现实世界的性能问题,否则请相信框架并且不要担心。

于 2008-11-19T23:07:25.900 回答
0

集合的顺序由Set实现来保证,即SortedSet. 除非您使用 aList来跟踪数据库上的索引,否则排序仅在服务器端。

如果您的域类在 aSortedSet中,则必须实现Comparable以启用对集合的正确排序。

性能问题本身并不是一个真正的问题。如果你想访问一个单一的Tag,你应该通过它的Id来获取它。如果您想要排序的标签,那么排序只有在您查看 all 时才有意义Tags,而不是特定的标签,因此您最终Tags会一次检索所有标签。SortedSet由于排序是在服务器端而不是在数据库端执行的,所以在数据库方面 a和常规之间并没有太大区别HashSet

于 2008-11-14T13:48:12.210 回答
0

Grails 文档似乎已更新:

http://grails.org/doc/1.0.x/

在 5.2.4 节中,他们讨论了集合类型的潜在性能问题。

这是相关部分:

关于集合类型和性能的说明

Java Set 类型是一个不允许重复的集合。为了在将条目添加到 Set 关联时确保唯一性,Hibernate 必须从数据库中加载整个关联。如果关联中有大量条目,这在性能方面可能会很昂贵。

List 类型需要相同的行为,因为 Hibernate 需要加载整个关联以保持顺序。因此,如果您预计关联中有大量记录,则建议您进行双向关联,以便可以在反面创建链接。例如考虑以下代码:

def book = new Book(title:"New Grails Book")
def author = Author.get(1)
book.author = author
book.save()

在此示例中,关联链接是由子 (Book) 创建的,因此无需直接操作集合,从而减少查询并提高代码效率。如果您要编写如下代码,给定具有大量关联 Book 实例的 Author,您会看到对性能的影响:

def book = new Book(title:"New Grails Book")
def author = Author.get(1)
author.addToBooks(book)
author.save()
于 2008-11-20T02:10:19.260 回答