다음과 같이 했더니, insert속도가 너무 느렸다.
보통 transaction쓰면, 나중에 한번에 commit하면서 db에 저장이 되기 때문에 속도가 빠른데, 실제로도 commit전에 그냥 저장되고 있었다.
문제는 Exec로 바로 쓸 수 있는 Prepare방식에 있었는데
tx, err := db.Begin() // transaction썼는데 왜이러지?
defer tx.Rollback()
for ... {
_, err := db.Exec("insert into ostem_log(dd, didx, dt, lvl, cont) value (?,?,?, ?, ?)", dd, didx, matches[1], matches[2], matches[3])
}
tx.Commit()
db.Exec와 같이 쓸 수는 있지만, 아래 처름 받은 transaction으로 Prepare를 미리 만들 어준 후, loop에서는 값 만 받아 작업해야, 진정한 transcation처리가 된다.
이제 제대로 동작하며 속도는 처음과 달리 천배(?) 정도 빨라진다.
tx, err := db.Begin()
defer tx.Rollback()stmt, err := tx.Prepare(`insert into ostem_log(dd, didx, dt, lvl, cont) value (?,?,?, ?, ?)`)for ...
_, err := stmt.Exec(dd, didx, matches[1], matches[2], matches[3])