我想运行单独的goroutine,它可以与MySQL数据库一起工作.我编写了代码,如果goroutine的数量少于1000,它确实可以工作.但当我把它改成1000时,Go开始panic .
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"time"
)
func routine(db *sql.DB, id int, ch chan<- string) {
update, _ := db.Prepare("SELECT salary FROM users WHERE id = (?)")
defer update.Close()
var salary string
update.QueryRow(id).Scan(&salary)
ch <- salary
}
func main() {
n := 1000
ch := make(chan string)
list := make([]string, n)
db, _ := sql.Open("mysql", "root:root@/database")
db.SetConnMaxLifetime(time.Minute * 3)
defer db.Close()
for i := 0; i < n; i++ {
go routine(db, 123, ch)
}
for i := 0; i < n; i++ {
list[i] = <-ch
}
}
这里是错误
panic: runtime error: invalid memory address or nil pointer dereference
panic: runtime error: invalid memory address or nil pointer dereference
goroutine 948 [running]:
database/sql.(*Stmt).Close(0x0)
C:/Program Files/Go/src/database/sql/sql.go:2872 +0x37
panic({0x4e8b20, 0x689240})
C:/Program Files/Go/src/runtime/panic.go:838 +0x207
database/sql.(*Stmt).QueryContext(0x0, {0x5788e8, 0xc000018050}, {0xc000d5bf60, 0x1, 0x1})
C:/Program Files/Go/src/database/sql/sql.go:2767 +0x82
database/sql.(*Stmt).QueryRowContext(0x0?, {0x5788e8?, 0xc000018050?}, {0xc000d5bf60?, 0x27?, 0x0?})
C:/Program Files/Go/src/database/sql/sql.go:2845 +0x2c
database/sql.(*Stmt).QueryRow(...)
C:/Program Files/Go/src/database/sql/sql.go:2867
main.routine(0x0?, 0x0?, 0x0?)
C:/Users/me/Desktop/go/5. MySQL/main.go:13 +0xfb
created by main.main
C:/Users/me/Desktop/go/5. MySQL/main.go:28 +0xba
我真的不确定这个错误的原因是什么.该代码使用较少的goroutine.此外,我try 使用SQLite适配器,1000个Goroutine工作得很好.但MySQL中的1000不是.
你能描述一下如何摆脱这些panic ,让1000个甚至上万个goroutine与数据库一起工作吗?
My Go version is 1.18.3 windows/amd64
github.com/go-sql-driver/mysql - v1.6.0