github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/models/db.go (about)

     1  package models
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  	"github.com/insionng/yougam/libraries/go-xorm/xorm"
     7  )
     8  
     9  var (
    10  	cache        = make([]interface{}, 0)
    11  	mutex        sync.RWMutex
    12  	isTimeout    bool
    13  	maxCacheSize = 100
    14  	firstTime    time.Time
    15  	timeOut      = 20 * time.Second
    16  )
    17  
    18  func CacheInsert(orm *xorm.Engine, beans ...interface{}) (int64, error) {
    19  	mutex.Lock()
    20  	defer mutex.Unlock()
    21  	if len(cache) == 0 {
    22  		firstTime = time.Now()
    23  		isTimeout = false
    24  	} else {
    25  		isTimeout = time.Now().Sub(firstTime) > timeOut
    26  	}
    27  
    28  	cache = append(cache, beans...)
    29  	if len(cache) >= maxCacheSize || isTimeout {
    30  		affected, err := orm.Insert(&cache)
    31  		cache = make([]interface{}, 0)
    32  		return affected, err
    33  	}
    34  	return 0, nil
    35  }
    36  
    37  /*
    38  type User struct {
    39  	Id   int64
    40  	Name string
    41  }
    42  
    43  func main() {
    44  	orm, err := xorm.NewEngine("sqlite3", "./test.db")
    45  	if err != nil {
    46  		fmt.Println(err)
    47  		return
    48  	}
    49  
    50  	orm.ShowSQL = true
    51  	err = orm.Sync(new(User))
    52  	if err != nil {
    53  		fmt.Println(err)
    54  		return
    55  	}
    56  
    57  	for i := 0; i < 200; i++ {
    58  		users := []interface{}{
    59  			User{Name: fmt.Sprintf("a%d", i)},
    60  		}
    61  		_, err = CacheInsert(orm, users...)
    62  		if err != nil {
    63  			fmt.Println(err)
    64  			return
    65  		}
    66  	}
    67  }
    68  */
    69  
    70  /*
    71  import (
    72  	"errors"
    73  	"fmt"
    74  	"github.com/insionng/yougam/helper"
    75  	"time"
    76  )
    77  
    78  var (
    79  	TStartTime time.Time
    80  	TList      []interface{}
    81  	TLimit     = 10000
    82  	TTimes     = 2
    83  )
    84  */
    85  /*
    86  	缓存TTimes 秒 内的所有插入请求,上限设为10000行
    87  	当超过TTimes 秒 或达到上限,并且被插入的内容不为空即执行事务
    88  */
    89  /*
    90  func Insert(beans ...interface{}) (int64, error) {
    91  	if beans != nil {
    92  		if TStartTime.IsZero() {
    93  			TStartTime = time.Now()
    94  			fmt.Println("开始时间:", TStartTime)
    95  		}
    96  
    97  		//小于TTimes秒 or 小于限制
    98  		if since := int(time.Since(TStartTime).Seconds()); (since < TTimes) || (len(TList) < TLimit) {
    99  
   100  			fmt.Println("//小于TTimes秒 or 小于限制")
   101  			if len(TList) < TLimit { //如果列表未满 可以无视超时把beans添加到TList
   102  
   103  				fmt.Println("//如果列表未满 可以无视超时把beans添加到TList")
   104  				for k, v := range beans {
   105  					TList = append(TList, v)
   106  					fmt.Println("K1#", k, ",append:", v)
   107  				}
   108  				beans = nil
   109  				fmt.Println("TList = append(TList, v):", len(TList))
   110  			}
   111  
   112  			if len(TList) >= TLimit { //如果列表已满则执行
   113  				fmt.Println("//如果列表已满则执行")
   114  				return Execute(beans)
   115  			} else if since := int(time.Since(TStartTime).Seconds()); since >= TTimes && (len(TList) > 0) { //另外若果列表未满 但超时 则执行
   116  				fmt.Println("//另外若果列表未满 但超时 则执行")
   117  				return Execute(beans)
   118  			} else { //另外 小于TTimes秒 or 列表未满
   119  				//return Insert(beans) //继续传递未处理beans
   120  				//return -1, errors.New("Insert()发生错误,beans:" + fmt.Sprint(beans))
   121  				fmt.Println("return Execute(beans) //继续传递未处理beans")
   122  				return Execute(beans) //继续传递未处理beans
   123  			}
   124  
   125  		} else { //大于TTimes秒 or 大于限制 则执行 并传递未处理beans
   126  			fmt.Println("//大于TTimes秒 or 大于限制 则执行 并传递未处理beans")
   127  			return Execute(beans)
   128  		}
   129  
   130  	} else {
   131  		fmt.Println("Insert Errors!")
   132  		return -1, errors.New("Insert Errors!")
   133  	}
   134  
   135  }
   136  
   137  func Execute(beans ...interface{}) (int64, error) {
   138  
   139  	if TList != nil {
   140  		// 创建 Session 对象
   141  		fmt.Println("// 创建 Session 对象")
   142  		sess := Engine.NewSession()
   143  		defer sess.Close()
   144  		// 启动事务
   145  		fmt.Println("// 启动事务")
   146  		if err := sess.Begin(); err != nil {
   147  			fmt.Println("// 启动事务失败")
   148  			return -1, err
   149  		} else {
   150  			fmt.Println("// 启动事务成功")
   151  			if len(TList) < TLimit && (len(beans)-1) != 0 {
   152  				fmt.Println("// len(TList) < TLimit && (len(beans)-1) != 0 ")
   153  				for k, v := range beans {
   154  					TList = append(TList, v)
   155  					fmt.Println(">>>>>>>>>K2#", k, ",append:", v)
   156  				}
   157  			}
   158  
   159  			//执行事务
   160  			fmt.Println("时间:", helper.TimeSince(TStartTime), "len(TList):", len(TList))
   161  
   162  			for _, v := range TList {
   163  				if row, err := sess.Insert(v); err != nil || row <= 0 {
   164  					fmt.Println("执行事务失败:", err)
   165  					sess.Rollback()
   166  					return -1, err
   167  				}
   168  			}
   169  
   170  			// 提交事务
   171  			fmt.Println("//提交事务")
   172  			if err = sess.Commit(); err != nil {
   173  				//事务提交失败后继续传递参数
   174  				//不管参数beans是否为空,下一轮自会检查并处理
   175  				fmt.Println("//事务提交失败后继续传递参数,err:", err)
   176  				return Insert(beans)
   177  				//return -1, err
   178  			} else {
   179  				//事务完成后
   180  				fmt.Println("//事务完成后")
   181  				if len(TList) >= TLimit && beans != nil {
   182  					//重置变量
   183  					fmt.Println("//重置变量AAA")
   184  					TList = nil
   185  					TStartTime = time.Now()
   186  					return Insert(beans) //继续传递未处理 beans
   187  				}
   188  				//重置变量
   189  				fmt.Println("//重置变量BBB")
   190  				TList = nil
   191  				TStartTime = time.Now()
   192  			}
   193  		}
   194  	} else { //TList为nil
   195  		fmt.Println(" //TList为nil start")
   196  		if beans != nil {
   197  			fmt.Println(" //beans != nil")
   198  
   199  			TStartTime = time.Now()
   200  			return Insert(beans) //继续传递未处理 beans
   201  		}
   202  
   203  		fmt.Println(" ////TList为nil end")
   204  		return -1, errors.New("Execute() 参数不能都为空!")
   205  	}
   206  
   207  	return -1, nil
   208  }
   209  */