【发布时间】:2015-09-29 09:03:10
【问题描述】:
在我的 Grails 应用程序中,我非常兴奋地使用了一些技术,但最近我遇到了一些性能问题,我将描述我的场景:
- 一张桌子有 400 万多个整体;
- 我正在使用事件总线 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 对象并将其置于休眠会话中。
使用flush完成这项工作的正确方法是什么?批? - 对方法的调用是异步的。
这段代码在 (07/14) 之前都可以正常工作,但在这几天里它非常慢,在数据库中插入 10K 的 alloc 大约需要 1.30 分钟;
非常感谢您的建议。
【问题讨论】: