otter_update_test/update_running.go
2020-03-05 11:46:10 +08:00

102 lines
1.8 KiB
Go

package main
import (
"database/sql"
"log"
"strconv"
"sync"
"time"
"github.com/Pallinder/go-randomdata"
_ "github.com/go-sql-driver/mysql"
)
func GetConnect(port int) *sql.DB {
mysqluri := "root:yame123456@tcp(localhost:" + strconv.Itoa(port) + ")/yame"
db, err := sql.Open("mysql", mysqluri)
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
return db
}
func dbUpdate(db *sql.DB, names []string) {
now := time.Now()
N := 1
for i := 0; i < N; i++ {
for _, name := range names {
tx, err := db.Begin()
if err != nil {
panic(err)
}
age := strconv.Itoa(randomdata.Number(0, 105))
level := strconv.Itoa(randomdata.Number(0, 10))
attr := randomdata.Address()
tx.Exec("update user set age = ?, level = ?, attr = ? where name = ?", age, level, attr, name)
err = tx.Commit()
if err != nil {
panic(err)
}
}
}
log.Println(int64(len(names)*N)/(time.Now().Unix()-now.Unix()), " update qps")
}
func updateTask(port int, wg *sync.WaitGroup) {
defer wg.Done()
db := GetConnect(port)
dbUpdate(db, RandomSelectNames(db))
}
func RandomSelectNames(db *sql.DB) []string {
var names []string
COUNT := 1000
for i := 0; i < COUNT; i++ {
age := randomdata.Number(0, 105)
taskid := randomdata.Number(0, 1000)
offset := randomdata.Number(0, 100)
rows, err := db.Query("select * from (select name from user where taskid = ? and age = ? limit 1000 OFFSET ?)t1 order by rand() ", taskid, age, offset)
if err != nil {
panic(err)
}
for rows.Next() {
var name string
rows.Scan(&name)
names = append(names, name)
}
}
log.Println(len(names))
return names
}
func Updating() {
gcount := 50
wg := &sync.WaitGroup{}
wg.Add(gcount)
for i := 0; i < gcount; i++ {
go updateTask(3306, wg)
} // DBInsert(23306)
wg.Wait()
log.Println("gthread: ", gcount)
}