为了向Postgres数据库添加数百万条记录并且内存消耗不断增加,我使用的是一个包含多个worker和gorp.Transaction
的线程池。
每百万条记录,以下代码从不同的线程调用大约一百次,每次处理一批10000条记录左右:
func batchCopy(p importParams) error {
copy := pq.CopyIn("entity", "startdate", "value", "expirydate", "accountid")
stmt, err := p.txn.Prepare(copy)
if err != nil {
return err
}
for _, r := range p.records {
_, err := stmt.Exec(
r.startDate,
r.value,
r.expiryDate,
p.accountId)
if err != nil {
return err
}
}
if err := stmt.Close(); err != nil {
return err
}
return nil
}
出于某种原因,我注意到Prepare
和Close
来电时间很长,这个过程会非常缓慢。
然后我尝试对batchCopy
的所有调用重用相同的语句,并在完成所有调用后关闭它。在这种情况下,batchCopy
完成得非常快,但是当我拨打stmt.Close()
时,它会花费很长时间。
问题:
stmt.Close()
发生了什么,为什么在多次致电stmt.Exec
后需要这么长时间?