[英]GORM in goroutines freezes if large query limit
我已決定建立服務來創建CSV報告。
使用中:Go 1.12,GORM(作為PostgreSQL ORM)
func main() {
... // init DB connection etc
defer db.Close()
go fetch(db)
for {} // keeps open process
}
func fetch(db *gotm.DB) {
.... // some code counts pages, creates file etc
sqlLimit := 20000 // set limit
for i := 0; i < pages; i++ {
db.Table("reports_bookings"),Debug().Where(sql).Offset(i * sqlLimit).Limit(sqlLimit).Find(&myModels)
.... // code: push it to file
}
}
因此,當代碼嘗試獲取數據時,它只會凍結。 例如,如果減小限制並設置為100,它將運行2次SQL並凍結。
Debug()
並沒有顯示任何內容。 正如我所說的那樣,它似乎凍結了。 從處理器加載一個內核。
不用goroutines就可以了。 您能幫我弄清楚為什么它在goroutines中不起作用嗎?
提前致謝。
編輯
也許我的方法不好,您可以建議如何解決。 最后,應將文件上傳到S3(例如)
在退出程序之前,您需要等待所有goroutine完成。
func main() {
... // init DB connection etc
wg := sync.WaitGroup{}
defer db.Close()
wg.Add(1) // number of goroutines
go fetch(db, &wg)
wg.Wait() // wait for goroutines before exiting
}
func fetch(db *gotm.DB, wg *sync.WaitGroup) {
.... // some code counts pages, creates file etc
sqlLimit := 20000 // set limit
for i := 0; i < pages; i++ {
db.Table("reports_bookings"),Debug().Where(sql).Offset(i * sqlLimit).Limit(sqlLimit).Find(&myModels)
.... // code: push it to file
for {} // keeps open process
}
}
否則,您的程序將在goroutine完成之前退出
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.