Grail 2.4.3 AddTo内存泄漏问题

时间:2014-10-22 09:50:27

标签: database grails

我已经从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是否最有效?

1 个答案:

答案 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。您的域类名称是否真的以小写字母开头?