繁体   English   中英

Grails addTo *与事件一起缓慢执行

[英]Grails addTo* slowly performance with event

在我的Grails应用程序中,我正在使用一些非常激动的技术,但是最近我在性能方面遇到了一些问题,我将描述一下我的情况:

  • 一张桌子,全场4M +;
  • 我正在使用事件总线API;
  • Grails 2.2.3;
  • MySQL数据库;

当客户创建新房间时,也会创建一些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对象,并将其置于休眠会话中。

使用冲洗执行此工作的正确方法是什么? 批量? -对方法的调用是异步的。

直到(07/14)这段代码都可以正常工作,但是这段时间非常慢,大约需要1.30分钟才能在数据库中插入10K alloc;

非常感谢您的建议。

因为allocs是一个Set (定义hasMany关系时为默认的Grails集合类型),所以Grails必须在插入发生之前将整个集合加载到内存中,以确保唯一性。

查看Bert Beckwith的演讲 ,了解使用GORM集合对性能的影响。

我认为您有两种选择。 您可以完全取消集合引用,而只需定义您的类,如下所示:

class Alloc {
    Room room
}

class Room {
    //no reference child Allocs
}

另外,您可以将allocs集合定义为bag:

class Alloc {
    static belongsTo = [room: Room]
}

class Room {
    Collection allocs
    static hasMany = [allocs: Alloc]
}

在这种情况下,无需进行唯一性检查,并且addTo...方法无需将每个Alloc实例加载到内存中。 但是,您将负责自己维护唯一性。

参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM