· 9 years ago · Oct 04, 2016, 09:42 PM
1package main
2
3import (
4 "database/sql"
5 "flag"
6 "fmt"
7 "log"
8 "sync"
9 "time"
10
11 _ "github.com/go-sql-driver/mysql"
12)
13
14type datarow struct {
15 pk1 int
16 pk2 int
17 pk3 int
18 pk4 int
19 startTime time.Time
20 endTime time.Time
21}
22
23var MAX_CONCURRENT = 150
24
25func main() {
26 user := flag.String("user", "root", "db user name")
27 pass := flag.String("pass", "root", "db password")
28 host := flag.String("host", "127.0.0.1", "db host")
29 port := flag.Int("port", 3306, "port")
30 flag.Parse()
31
32 db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/?charset=utf8", *user, *pass, *host, *port))
33 if err != nil {
34 log.Fatal(err)
35 }
36 defer db.Close()
37 db.SetMaxOpenConns(10)
38
39 _, err = db.Exec("CREATE DATABASE IF NOT EXISTS test")
40 if err != nil {
41 log.Fatal(err)
42 }
43
44 _, err = db.Exec("DROP TABLE IF EXISTS test.t1")
45 if err != nil {
46 log.Fatal(err)
47 }
48
49 create := `
50 CREATE TABLE test.t1 (
51 pk1 int(11) NOT NULL,
52 pk2 int(11) NOT NULL,
53 pk3 int(11) NOT NULL,
54 pk4 int(11) NOT NULL,
55 f1 timestamp NULL DEFAULT NULL,
56 f2 timestamp NULL DEFAULT NULL,
57 PRIMARY KEY (pk1,pk2,pk3,pk4)
58 ) ENGINE=InnoDB DEFAULT CHARSET=utf8`
59 _, err = db.Exec(create)
60 if err != nil {
61 log.Fatal(err)
62 }
63
64 ps, err := db.Prepare("INSERT INTO test.t1 VALUES (?,?,?,?,?,?)")
65 if err != nil {
66 log.Fatal(err)
67 }
68 defer ps.Close()
69
70 ch := make(chan datarow, MAX_CONCURRENT*2)
71 var wg sync.WaitGroup
72 for i := 0; i < MAX_CONCURRENT; i++ {
73 wg.Add(1)
74 go write(ps, ch, &wg)
75 }
76
77 count := 0
78 for pk1 := 0; pk1 < 100; pk1++ {
79 for pk2 := 0; pk2 < 100; pk2++ {
80 for pk3 := 0; pk3 < 100; pk3++ {
81 for pk4 := 0; pk4 < 10; pk4++ {
82 rs := datarow{
83 pk1: pk1,
84 pk2: pk2,
85 pk3: pk3,
86 pk4: pk4,
87 startTime: time.Now().UTC(),
88 endTime: time.Now().UTC(),
89 }
90 ch <- rs
91 count++
92 }
93 }
94 fmt.Println(count)
95 }
96 fmt.Println(count)
97 }
98 fmt.Println(count)
99 close(ch)
100 wg.Wait()
101
102}
103
104func write(ps *sql.Stmt, c chan datarow, wg *sync.WaitGroup) {
105 for rs := range c {
106 _, err := ps.Exec(rs.pk1, rs.pk2, rs.pk3, rs.pk4, rs.startTime, nil)
107 if err != nil {
108 log.Println(err)
109 }
110 }
111 wg.Done()
112}