![b6e1f38967e357c711ca6d8fbdece453.png](https://i-blog.csdnimg.cn/blog_migrate/962d1fec398cf180673a0524367a168b.jpeg)
package main
import (
"fmt"
"math/rand"
"sync"
"time"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
//定义变量
var (
db *gorm.DB
err error
wg sync.WaitGroup
number = 50000 //测试数据条数
ch = make(chan int, 200) //定义通道
)
//User模型
type User struct {
ID uint `gorm:"primary_key"`
Name string
}
func main() {
//连接数据库
db, err = gorm.Open("mysql", "root:root@/ddta?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
fmt.Printf("Mysql连接失败:%sn", err)
return
}
//绑定模型
db.AutoMigrate(&User{})
//生产
wg.Add(number)
//插入数据
for i := 0; i < number; i++ {
//打印chan容量
fmt.Printf("通道长度:%d, 通道容量%d n", len(ch), cap(ch))
//写入chan
ch <- i
//goroutine
go insert(i)
}
//等待程序运行结束
wg.Wait()
//关闭通道
close(ch)
//关闭数据库连接
defer db.Close()
fmt.Println("执行完毕......")
}
//插入数据方法
func insert(i int) {
//随机字符串,给Name赋值
u := User{
Name: randStringRunes(10, i),
}
//插入数据
err = db.Create(&u).Error
//如果有误打印错误
if err != nil {
fmt.Printf("第[%d]条插入数据错误:%sn", i, err)
} else {
fmt.Printf("第[%d]条插入数据成功n", <-ch)
}
//消费一个
wg.Done()
}
// RandStringRunes 返回随机字符串
func randStringRunes(n, i int) string {
var letterRunes = []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
rand.Seed(time.Now().UnixNano() + int64(i))
b := make([]rune, n)
for i := range b {
b[i] = letterRunes[rand.Intn(len(letterRunes))]
}
return string(b)
}
执行期间报错:
[2020-05-28 11:29:48] dial tcp 127.0.0.1:3306: connectex: Only one usage of each socket address (protocol/network address/port) is normally permitted.
原因是因为win10系统最大TCB数量设置。注册表为:
[HKEY_LOCAL_MACHINE System CurrentControlSet Services Tcpip Parameters]
修改默认值数量,不明白的地方可以度一下。