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 */