使用mysql insert和select时Golang goroutines中出错 主程序包 进口( “数据库/sql” “fmt” “日志” “同步” “时间” _“github.com/go-sql-driver/mysql” ) func main(){ db,err:=sql.Open(“mysql”,“SECRET”) 如果错误!=零{ log.Println(错误) } _,uerr:=db.Exec(“使用“+”try”) 如果uerr!=nil{ log.Println(uerr) } 延迟db.Close() w:=新建(sync.WaitGroup) w、 加(100) syn:=func(文本字符串,w*sync.WaitGroup){ 推迟w.完成() db.Exec(“插入测试值(?)”,文本) fmt.Println(文本) } 对于i:=0;i

使用mysql insert和select时Golang goroutines中出错 主程序包 进口( “数据库/sql” “fmt” “日志” “同步” “时间” _“github.com/go-sql-driver/mysql” ) func main(){ db,err:=sql.Open(“mysql”,“SECRET”) 如果错误!=零{ log.Println(错误) } _,uerr:=db.Exec(“使用“+”try”) 如果uerr!=nil{ log.Println(uerr) } 延迟db.Close() w:=新建(sync.WaitGroup) w、 加(100) syn:=func(文本字符串,w*sync.WaitGroup){ 推迟w.完成() db.Exec(“插入测试值(?)”,文本) fmt.Println(文本) } 对于i:=0;i,mysql,go,goroutine,Mysql,Go,Goroutine,当我运行这段代码时,syn函数可以正常工作100次。 但是在循环之后,我得到了一个如下的错误 错误1046:未选择数据库紧急:运行时错误:内存无效 地址或零指针解引用[信号0xc0000005代码=0x0 地址=0x0 pc=0x4dc067] 我的目标是使用goroutines插入mysql数据库。 为什么会发生错误?我该怎么做呢?“syn funtion可以正常工作100次”你怎么知道?在代码示例中,您没有检查由Exec返回的错误值。你在用你的真实代码检查它吗?另外,“SECRET”不是有效

当我运行这段代码时,syn函数可以正常工作100次。 但是在循环之后,我得到了一个如下的错误

错误1046:未选择数据库紧急:运行时错误:内存无效 地址或零指针解引用[信号0xc0000005代码=0x0 地址=0x0 pc=0x4dc067]

我的目标是使用goroutines插入mysql数据库。
为什么会发生错误?我该怎么做呢?

“syn funtion可以正常工作100次”你怎么知道?在代码示例中,您没有检查由
Exec
返回的错误值。你在用你的真实代码检查它吗?另外,
“SECRET”
不是有效的连接字符串。从
Open
获取
db
后,应调用
db.Ping()
检查是否可以连接到数据库。请参阅的答案。go SQL包使用一个连接池,因此您的
use X
在池中的一个连接上运行;在某个时刻,将使用另一个连接,并且不会选择任何数据库。@mkopriva哇,我没有考虑你说的话。@mkopriva检查“Exec”返回的值会返回与我提到的相同的错误。“秘密”是为了我的隐私。我不知道ping支票,但你的提及给了我很多帮助。非常感谢。
    package main

    import (
        "database/sql"
        "fmt"
        "log"
        "sync"
        "time"

        _ "github.com/go-sql-driver/mysql"
    )

    func main() {
        db, err := sql.Open("mysql", "SECRET")
        if err != nil {
            log.Println(err)
        }
        _, uerr := db.Exec("USE " + "try")
        if uerr != nil {
            log.Println(uerr)
        }
        defer db.Close()


        w := new(sync.WaitGroup)
        w.Add(100)

        syn := func(text string, w *sync.WaitGroup) {
            defer w.Done()
            db.Exec("INSERT INTO test VALUES(?)", text)
            fmt.Println(text)
        }

        for i := 0; i < 100; i++ {
            msg := fmt.Sprintf("Content %d", i)
            go syn(msg, w)

        }
        w.Wait()

        var (
            cn string
        )
        rows, er := db.Query("SELECT * FROM test")
        if er != nil {
            log.Println(er)
        }

        for rows.Next() {
            err := rows.Scan(&cn)
            if err != nil {
                log.Println(err)
            }
            fmt.Println("-----", cn)
        }
    }