簡體   English   中英

如果查詢數量過多,goroutines中的GORM將凍結

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM