我已经从CSV文件中读取了大量数据,我现在需要将其存储在数据库中,我这样做是为了这样做,带有级联保存:
class saveData() {
def data = session.getAttribute("Data")
def dataInfo = new DataInfo(firstName: params.firstName, lastName: params.lastName, email: params.email)
data.collect{
.addToCustomerDetails(new dataCustomerInfo(number: it[0], email: it[1], email: it[2]))
.save(flush:true)
}
if (dataInfo.validate()) {
redirect(action: "list", id: dataInfo.id)
}
}
数据集可能是一百万行,前一千左右都很好,但事情开始放缓,最终我放弃了。用户可能有15分钟的宽限超时登录,但这个过程似乎需要30分钟来完成25,000行?
当使用这么大的数据时,进程AddTo是否最有效?
答案 0 :(得分:0)
我不认为你应该在这里使用双向一对多。预计不会有数百万个参考文献。
首先,使用带有belongsTo
的uni-dir o2m,它没有限制。
其次,你正面临着batch updates
的经典hibernate陷阱,它与bi-dir o2m一起导致会话溢出。您应该每1k行左右刷新一次会话:
int count = 0
data.each{
new dataCustomerInfo(number: it[0], email: it[1], email: it[2], dataInfo:dataInfo )
.save( flush:0 == count % 1000 )
}
P.S。您的域类名称是否真的以小写字母开头?