Skip to content

Instantly share code, notes, and snippets.

@reterVision
Created July 5, 2014 08:18
Show Gist options
  • Save reterVision/7520e5f162c8480e9126 to your computer and use it in GitHub Desktop.
Save reterVision/7520e5f162c8480e9126 to your computer and use it in GitHub Desktop.

Revisions

  1. reterVision created this gist Jul 5, 2014.
    67 changes: 67 additions & 0 deletions insert_pg.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,67 @@
    /*
    Original idea from
    http://www.acloudtree.com/how-to-shove-data-into-postgres-using-goroutinesgophers-and-golang/
    */
    package main

    import (
    "log"
    "time"
    "os"
    "fmt"
    "database/sql"
    _ "github.com/lib/pq"
    )

    func main() {
    fmt.Printf("StartTime: %v\n", time.Now())
    var (
    sStmt string = "insert into test (gopher_id, created) values ($1, $2)"
    gophers int = 10
    entries int = 10000
    )

    finishChan := make(chan int)

    for i := 0; i < gophers; i++ {
    go func(c chan int) {
    db, err := sql.Open("postgres", "host=localhost dbname=testdb sslmode=disable")
    if err != nil {
    log.Fatal(err)
    }
    defer db.Close()

    stmt, err := db.Prepare(sStmt)
    if err != nil {
    log.Fatal(err)
    }
    defer stmt.Close()

    for j := 0; j < entries; j++ {
    res, err := stmt.Exec(j, time.Now())
    if err != nil || res == nil {
    log.Fatal(err)
    }
    }

    c <- 1
    }(finishChan)
    }

    finishedGophers := 0
    finishLoop := false
    for {
    if finishLoop {
    break
    }
    select {
    case n := <-finishChan:
    finishedGophers += n
    if finishedGophers == 10 {
    finishLoop = true
    }
    }
    }

    fmt.Printf("StopTime: %v\n", time.Now())
    }