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

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"time"
     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 := 500
    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  				for j := 0; j < 10; j++ {
    47  					if x+j < 2 {
    48  						_, err = engine.Get(u)
    49  					} else if x+j < 4 {
    50  						users := make([]User, 0)
    51  						err = engine.Find(&users)
    52  					} else if x+j < 8 {
    53  						_, err = engine.Count(u)
    54  					} else if x+j < 16 {
    55  						_, err = engine.Insert(&User{Name: "xlw"})
    56  					} else if x+j < 32 {
    57  						//_, err = engine.Id(1).Delete(u)
    58  						_, err = engine.Delete(u)
    59  					}
    60  					if err != nil {
    61  						fmt.Println(err)
    62  						queue <- x
    63  						return
    64  					}
    65  				}
    66  				fmt.Printf("%v success!\n", x)
    67  			}
    68  			queue <- x
    69  		}(i)
    70  	}
    71  
    72  	for i := 0; i < size; i++ {
    73  		<-queue
    74  	}
    75  
    76  	//conns := atomic.LoadInt32(&xorm.ConnectionNum)
    77  	//fmt.Println("connection number:", conns)
    78  	fmt.Println("end")
    79  }
    80  
    81  func main() {
    82  	fmt.Println("-----start sqlite go routines-----")
    83  	engine, err := sqliteEngine()
    84  	if err != nil {
    85  		fmt.Println(err)
    86  		return
    87  	}
    88  	engine.ShowSQL(true)
    89  	cacher := xorm.NewLRUCacher2(xorm.NewMemoryStore(), time.Hour, 1000)
    90  	engine.SetDefaultCacher(cacher)
    91  	fmt.Println(engine)
    92  	test(engine)
    93  	fmt.Println("test end")
    94  	engine.Close()
    95  
    96  	fmt.Println("-----start mysql go routines-----")
    97  	engine, err = mysqlEngine()
    98  	engine.ShowSQL(true)
    99  	cacher = xorm.NewLRUCacher2(xorm.NewMemoryStore(), time.Hour, 1000)
   100  	engine.SetDefaultCacher(cacher)
   101  	if err != nil {
   102  		fmt.Println(err)
   103  		return
   104  	}
   105  	defer engine.Close()
   106  	test(engine)
   107  }