github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/go-xorm/xorm/examples/goroutine.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"runtime"
     7  
     8  	_ "github.com/go-sql-driver/mysql"
     9  	"github.com/insionng/yougam/libraries/xorm"
    10  	_ "github.com/mattn/go-sqlite3"
    11  )
    12  
    13  type User struct {
    14  	Id   int64
    15  	Name string
    16  }
    17  
    18  func sqliteEngine() (*xorm.Engine, error) {
    19  	os.Remove("./test.db")
    20  	return xorm.NewEngine("sqlite3", "./goroutine.db")
    21  }
    22  
    23  func mysqlEngine() (*xorm.Engine, error) {
    24  	return xorm.NewEngine("mysql", "root:@/test?charset=utf8")
    25  }
    26  
    27  var u = &User{}
    28  
    29  func test(engine *xorm.Engine) {
    30  	err := engine.CreateTables(u)
    31  	if err != nil {
    32  		fmt.Println(err)
    33  		return
    34  	}
    35  
    36  	size := 100
    37  	queue := make(chan int, size)
    38  
    39  	for i := 0; i < size; i++ {
    40  		go func(x int) {
    41  			//x := i
    42  			err := engine.Ping()
    43  			if err != nil {
    44  				fmt.Println(err)
    45  			} else {
    46  				/*err = engine.(u)
    47  				if err != nil {
    48  					fmt.Println("Map user failed")
    49  				} else {*/
    50  				for j := 0; j < 10; j++ {
    51  					if x+j < 2 {
    52  						_, err = engine.Get(u)
    53  					} else if x+j < 4 {
    54  						users := make([]User, 0)
    55  						err = engine.Find(&users)
    56  					} else if x+j < 8 {
    57  						_, err = engine.Count(u)
    58  					} else if x+j < 16 {
    59  						_, err = engine.Insert(&User{Name: "xlw"})
    60  					} else if x+j < 32 {
    61  						_, err = engine.Id(1).Delete(u)
    62  					}
    63  					if err != nil {
    64  						fmt.Println(err)
    65  						queue <- x
    66  						return
    67  					}
    68  				}
    69  				fmt.Printf("%v success!\n", x)
    70  				//}
    71  			}
    72  			queue <- x
    73  		}(i)
    74  	}
    75  
    76  	for i := 0; i < size; i++ {
    77  		<-queue
    78  	}
    79  
    80  	//conns := atomic.LoadInt32(&xorm.ConnectionNum)
    81  	//fmt.Println("connection number:", conns)
    82  	fmt.Println("end")
    83  }
    84  
    85  func main() {
    86  	runtime.GOMAXPROCS(2)
    87  	fmt.Println("-----start sqlite go routines-----")
    88  	engine, err := sqliteEngine()
    89  	if err != nil {
    90  		fmt.Println(err)
    91  		return
    92  	}
    93  	engine.ShowSQL = true
    94  	fmt.Println(engine)
    95  	test(engine)
    96  	fmt.Println("test end")
    97  	engine.Close()
    98  
    99  	fmt.Println("-----start mysql go routines-----")
   100  	engine, err = mysqlEngine()
   101  	if err != nil {
   102  		fmt.Println(err)
   103  		return
   104  	}
   105  	defer engine.Close()
   106  	test(engine)
   107  }