/
db.go
78 lines (66 loc) · 1.51 KB
/
db.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package global
import (
"database/sql"
"fmt"
"os"
"time"
log "github.com/cihub/seelog"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)
type DBLog struct{}
func (dblog *DBLog) Print(v ...interface{}) {
log.Trace(v)
}
var db *gorm.DB
func initDb() {
if db != nil {
return
}
dataSourceName := fmt.Sprintf(
"%s:%s@%s(%s)/%s?%s",
Configs.Mysql.User,
Configs.Mysql.Pass,
Configs.Mysql.Protocol,
Configs.Mysql.Address,
Configs.Mysql.Db,
Configs.Mysql.Params,
)
if err := retry("init db", 10, func() (e error) {
db, e = gorm.Open("mysql", dataSourceName)
return e
}); err != nil {
log.Error(err.Error())
os.Exit(1)
}
if os.Getenv("GIN_MODE") == "debug" || os.Getenv("GIN_MODE") == "test" {
db.LogMode(true)
db.SetLogger(&DBLog{})
}
db.LogMode(true)
db.SetLogger(&DBLog{})
//db.SingularTable(DBSingularTable)
db.DB().SetMaxIdleConns(int(Configs.Mysql.MaxOpenConns))
db.DB().SetMaxOpenConns(int(Configs.Mysql.MaxIdleConns))
}
func DB() *gorm.DB {
return db.New()
}
func Begin() *gorm.DB {
return db.Begin()
}
func retry(desc string, retryTimes int, method func() error) (err error) {
for i := 1; i < retryTimes+1; i++ {
err = method()
if err == nil {
return
} else if err == sql.ErrNoRows {
log.Warnf("%s no rows found: %s", desc, err)
return
}
log.Warnf("%s failed: %s, will retry %d times", desc, err, i)
time.Sleep(time.Duration(i*i) * time.Second)
}
log.Warnf("%s failed after retry %d times, last error: %s", desc, retryTimes, err)
return err
}