使用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
当我运行这段代码时,syn函数可以正常工作100次。 但是在循环之后,我得到了一个如下的错误 错误1046:未选择数据库紧急:运行时错误:内存无效 地址或零指针解引用[信号0xc0000005代码=0x0 地址=0x0 pc=0x4dc067] 我的目标是使用goroutines插入mysql数据库。使用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 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)
}
}