database.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package config
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "time"
  7. mysql2 "github.com/go-sql-driver/mysql"
  8. "github.com/sirupsen/logrus"
  9. "gorm.io/driver/mysql"
  10. "gorm.io/gorm"
  11. "gorm.io/gorm/logger"
  12. "gorm.io/plugin/dbresolver"
  13. )
  14. var (
  15. DB *gorm.DB
  16. LDB *gorm.DB
  17. GDB1 *gorm.DB
  18. GDBGroup map[int]*gorm.DB
  19. //AdminDB *gorm.DB
  20. )
  21. func InitDatabase() {
  22. initDefaultDB()
  23. initGraveDB()
  24. initLoginDB()
  25. //initAdminDB()
  26. }
  27. func initDefaultDB() {
  28. connString := os.Getenv("MYSQL_DSN")
  29. newLogger := logger.New(
  30. log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
  31. logger.Config{
  32. SlowThreshold: time.Second, // Slow SQL threshold
  33. LogLevel: logger.Info, // Log level(这里记得根据需求改一下)
  34. IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
  35. Colorful: false, // Disable color
  36. },
  37. )
  38. db, err := gorm.Open(mysql.Open(connString), &gorm.Config{
  39. Logger: newLogger,
  40. SkipDefaultTransaction: true,
  41. })
  42. if connString == "" || err != nil {
  43. logrus.Fatalf("mysql lost: %v", err)
  44. }
  45. sqlDB, err := db.DB()
  46. if err != nil {
  47. logrus.Fatalf("mysql lost: %v", err)
  48. }
  49. sqlDB.SetMaxIdleConns(10)
  50. sqlDB.SetMaxOpenConns(20)
  51. sqlDB.SetConnMaxLifetime(2 * time.Hour)
  52. DB = db
  53. }
  54. //func initAdminDB() {
  55. // connString := os.Getenv("ADMIN_MYSQL_DSN")
  56. // newLogger := logger.New(
  57. // log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
  58. // logger.Config{
  59. // SlowThreshold: time.Second, // Slow SQL threshold
  60. // LogLevel: logger.Info, // Log level(这里记得根据需求改一下)
  61. // IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
  62. // Colorful: false, // Disable color
  63. // },
  64. // )
  65. //
  66. // db, err := gorm.Open(mysql.Open(connString), &gorm.Config{
  67. // Logger: newLogger,
  68. // SkipDefaultTransaction: true,
  69. // })
  70. //
  71. // if connString == "" || err != nil {
  72. // logrus.Fatalf("mysql lost: %v", err)
  73. // }
  74. // sqlDB, err := db.DB()
  75. // if err != nil {
  76. // logrus.Fatalf("mysql lost: %v", err)
  77. // }
  78. //
  79. // sqlDB.SetMaxIdleConns(10)
  80. // sqlDB.SetMaxOpenConns(20)
  81. // sqlDB.SetConnMaxLifetime(2 * time.Hour)
  82. // AdminDB = db
  83. //}
  84. func initGraveDB() {
  85. GDBGroup = make(map[int]*gorm.DB)
  86. GDB1 = initSingleGraveDB(os.Getenv("MYSQL_GRAVE_DSN"), os.Getenv("MYSQL_GRAVE_SLAVE_DSN"), 1)
  87. GDBGroup[1] = GDB1
  88. // 游戏服数据库组,新加服务器时往后续就行
  89. // 当连续3各数据库都不存在时,停止遍历
  90. failNum := 0
  91. for i := 2; i < 10000; i += 1 {
  92. conn := os.Getenv(fmt.Sprintf("MYSQL_GRAVE%v_DSN", i))
  93. slave := os.Getenv(fmt.Sprintf("MYSQL_GRAVE%v_SLAVE_DSN", i))
  94. if conn == "" || slave == "" {
  95. failNum += 1
  96. if failNum > 3 {
  97. return
  98. }
  99. //logrus.Warnf("initSingleGraveDB empty index[%v] present, skipped..", index)
  100. continue
  101. }
  102. failNum = 0
  103. initSingleGraveDB(conn, slave, i)
  104. }
  105. }
  106. func initSingleGraveDB(conn, slave string, index int) *gorm.DB {
  107. //logrus.Debugf("initSingleGraveDB index:%v, conn:%v, slave:%v", index, conn, slave)
  108. newLogger := logger.New(
  109. log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
  110. logger.Config{
  111. SlowThreshold: time.Second, // Slow SQL threshold
  112. LogLevel: logger.Info, // Log level(这里记得根据需求改一下)
  113. IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
  114. Colorful: false, // Disable color
  115. },
  116. )
  117. db1, err := gorm.Open(mysql.Open(conn), &gorm.Config{
  118. Logger: newLogger,
  119. SkipDefaultTransaction: true,
  120. })
  121. if conn == "" || err != nil {
  122. logrus.Fatalf("mysql lost: %v", err)
  123. }
  124. // 读写分离
  125. err = db1.Use(dbresolver.Register(dbresolver.Config{
  126. Sources: []gorm.Dialector{mysql.Open(conn)},
  127. Replicas: []gorm.Dialector{mysql.Open(slave)},
  128. }))
  129. if slave == "" || err != nil {
  130. logrus.Fatalf("mysql dbresolver slaveString:%v, err: %v", slave, err)
  131. }
  132. sqlDB, err := db1.DB()
  133. if err != nil {
  134. logrus.Fatalf("mysql lost: %v", err)
  135. }
  136. sqlDB.SetMaxIdleConns(20)
  137. sqlDB.SetMaxOpenConns(50)
  138. sqlDB.SetConnMaxLifetime(2 * time.Hour)
  139. if index > 0 {
  140. GDBGroup[index] = db1
  141. }
  142. return db1
  143. }
  144. func initLoginDB() {
  145. connString := os.Getenv("MYSQL_LOGIN_DSN")
  146. newLogger := logger.New(
  147. log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
  148. logger.Config{
  149. SlowThreshold: time.Second, // Slow SQL threshold
  150. LogLevel: logger.Info, // Log level(这里记得根据需求改一下)
  151. IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
  152. Colorful: false, // Disable color
  153. },
  154. )
  155. db, err := gorm.Open(mysql.Open(connString), &gorm.Config{
  156. Logger: newLogger,
  157. SkipDefaultTransaction: true,
  158. })
  159. if connString == "" || err != nil {
  160. logrus.Fatalf("mysql lost: %v", err)
  161. }
  162. // 读写分离
  163. slaveString := os.Getenv("MYSQL_LOGIN_SLAVE_DSN")
  164. err = db.Use(dbresolver.Register(dbresolver.Config{
  165. Sources: []gorm.Dialector{mysql.Open(connString)},
  166. Replicas: []gorm.Dialector{mysql.Open(slaveString)},
  167. }))
  168. if slaveString == "" || err != nil {
  169. logrus.Fatalf("mysql dbresolver slaveString:%v, err: %v", slaveString, err)
  170. }
  171. sqlDB, err := db.DB()
  172. if err != nil {
  173. logrus.Fatalf("mysql lost: %v", err)
  174. }
  175. sqlDB.SetMaxIdleConns(20)
  176. sqlDB.SetMaxOpenConns(50)
  177. sqlDB.SetConnMaxLifetime(2 * time.Hour)
  178. LDB = db
  179. }
  180. // GetDBName 获取数据库库名
  181. func GetDBName(conn string) string {
  182. dsnConf, _ := mysql2.ParseDSN(conn)
  183. return dsnConf.DBName
  184. }
  185. func GetDBId(DB *gorm.DB) int {
  186. for k, db := range GDBGroup {
  187. if db == DB {
  188. return k
  189. }
  190. }
  191. return 0
  192. }