在我的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对象并将它放在一个休眠会话中。
使用同花顺,做这项工作的正确方法是什么?批量? - 对方法的调用是assync。
此代码在(07/14)之前工作正常,但在这几天它非常慢,类似于1.30分钟在数据库中插入10K的alloc;
非常感谢您的建议。
答案 0 :(得分:2)
因为allocs
是Set
(定义{{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...
实例加载到内存中。但是,您将自己负责保持独特性......