[英]Grails addTo* slowly performance with event
在我的Grails应用程序中,我正在使用一些非常激动的技术,但是最近我在性能方面遇到了一些问题,我将描述一下我的情况:
当客户创建新房间时,也会创建一些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.