Grails addTo *与事件缓慢表现

时间:2015-07-10 14:44:30

标签: mysql hibernate grails

在我的Grails应用程序中,我使用了一些非常兴奋的技术但最近我遇到了一些性能问题,我将描述我的内容:

  • 一张4M + entires的桌子;
  • 我正在使用Event Bus API;
  • Grails 2.2.3;
  • MySQL DB;

当客户创建新房间时,也会创建一些Alloc。

pseudo-code:
    Room {
      hasMany = aloccs: Alloc
    }

查看此代码(不是真正的代码,但具有相同的相同性):

@Listener(topic="topicAlocCreator")
def alocCreator(EventMessage<Long> message) {

    LocalDate start = new DateTime().toLocalDate()
    LocalDate end = new DateTime().plusYears(2).plusMonths(6).toLocalDate()
    LocalDate tmp = start


    Room room = Room.get(message.data)
    List channels = Channel.list
    while(tmp.compareTo(end) <= 0) {
        for(channel in channels) {
            room.addToAlocs(new Aloc(0, 0, tmp.toDate(), channel))
        }
        tmp = tmp.plusDays(1)
    }

    //end of method
}

这段代码工作正常,但是它生成了很多alloc对象并将它放在一个休眠会话中。

使用同花顺,做这项工作的正确方法是什么?批量? - 对方法的调用是assync。

此代码在(07/14)之前工作正常,但在这几天它非常慢,类似于1.30分钟在数据库中插入10K的alloc;

非常感谢您的建议。

1 个答案:

答案 0 :(得分:2)

因为allocsSet(定义{{​​1}}关系时的默认Grails集合类型),Grails必须在插入发生之前将整个集合加载到内存中,以便保证唯一性。

看看Bert Beckwith presentation关于使用GORM集合的性能影响。

我认为你有几个选择。你可以完全免除集合引用,只需像这样定义你的类:

hasMany

或者,您可以将class Alloc { Room room } class Room { //no reference child Allocs } 集合定义为行李:

allocs

在这种情况下,不需要进行唯一性检查,class Alloc { static belongsTo = [room: Room] } class Room { Collection allocs static hasMany = [allocs: Alloc] } 方法不需要将每个addTo...实例加载到内存中。但是,您将自己负责保持独特性......

Reference