go web db每次关闭_Go+Gorm+sync+chan+rand综合demo

b6e1f38967e357c711ca6d8fbdece453.png
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]

修改默认值数量,不明白的地方可以度一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值