Skip to content

Instantly share code, notes, and snippets.

@lendico-seong
Created June 8, 2016 14:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lendico-seong/662ea43126adc73de38b4b28b5b5b429 to your computer and use it in GitHub Desktop.
Save lendico-seong/662ea43126adc73de38b4b28b5b5b429 to your computer and use it in GitHub Desktop.
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
"strconv"
"sync"
)
/*
-- MySQL dump 10.13 Distrib 5.7.9, for osx10.9 (x86_64)
--
-- Host: 127.0.0.1 Database: test
-- ------------------------------------------------------
-- Server version 5.5.5-10.1.14-MariaDB-1~jessie
--
-- Table structure for table `test`
--
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`val` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
*/
func main() {
const numWorkers = 5
db, err := sql.Open("mysql", "root@tcp(127.0.0.1:3306)/test")
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
db.SetMaxOpenConns(numWorkers)
db.SetMaxIdleConns(numWorkers / 2)
jobs := make(chan int, numWorkers*2)
var wg sync.WaitGroup
for i := 0; i < numWorkers; i++ {
go work(db, &wg, jobs)
wg.Add(1)
}
for i := 0; i < 1000; i++ {
jobs <- i
}
close(jobs)
wg.Wait()
}
func work(db *sql.DB, wg *sync.WaitGroup, vals <-chan int) {
defer wg.Done()
for {
select {
case val, ok := <-vals:
if !ok {
return
}
insert(db, val)
}
}
}
func insert(db *sql.DB, val int) {
const sql = `
INSERT INTO test SET val = ?
`
stmt, err := db.Prepare(sql)
if err != nil {
panic(err)
}
defer func() {
err := stmt.Close()
if err != nil {
panic(err)
}
}()
res, err := stmt.Exec(strconv.Itoa(val))
if err != nil {
panic(err)
}
id, err := res.LastInsertId()
if err != nil {
panic(err)
}
log.Println(id)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment