database.go 5.5 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. db, err := gorm.Open(mysql.Open(connString), &gorm.Config{
  66. Logger: newLogger,
  67. SkipDefaultTransaction: true,
  68. })
  69. if connString == "" || err != nil {
  70. logrus.Fatalf("mysql lost: %v", err)
  71. }
  72. sqlDB, err := db.DB()
  73. if err != nil {
  74. logrus.Fatalf("mysql lost: %v", err)
  75. }
  76. sqlDB.SetMaxIdleConns(10)
  77. sqlDB.SetMaxOpenConns(20)
  78. sqlDB.SetConnMaxLifetime(2 * time.Hour)
  79. AdminDB = db
  80. }
  81. func initGraveDB() {
  82. GDBGroup = make(map[int]*gorm.DB)
  83. GDB1 = initSingleGraveDB(os.Getenv("MYSQL_GRAVE_DSN"), os.Getenv("MYSQL_GRAVE_SLAVE_DSN"), 1)
  84. GDBGroup[1] = GDB1
  85. // 游戏服数据库组,新加服务器时往后续就行
  86. // 当连续3各数据库都不存在时,停止遍历
  87. failNum := 0
  88. for i := 2; i < 10000; i += 1 {
  89. conn := os.Getenv(fmt.Sprintf("MYSQL_GRAVE%v_DSN", i))
  90. slave := os.Getenv(fmt.Sprintf("MYSQL_GRAVE%v_SLAVE_DSN", i))
  91. if conn == "" || slave == "" {
  92. failNum += 1
  93. if failNum > 3 {
  94. return
  95. }
  96. //logrus.Warnf("initSingleGraveDB empty index[%v] present, skipped..", index)
  97. continue
  98. }
  99. failNum = 0
  100. initSingleGraveDB(conn, slave, i)
  101. }
  102. }
  103. func initSingleGraveDB(conn, slave string, index int) *gorm.DB {
  104. //logrus.Debugf("initSingleGraveDB index:%v, conn:%v, slave:%v", index, conn, slave)
  105. newLogger := logger.New(
  106. log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
  107. logger.Config{
  108. SlowThreshold: time.Second, // Slow SQL threshold
  109. LogLevel: logger.Info, // Log level(这里记得根据需求改一下)
  110. IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
  111. Colorful: false, // Disable color
  112. },
  113. )
  114. db1, err := gorm.Open(mysql.Open(conn), &gorm.Config{
  115. Logger: newLogger,
  116. SkipDefaultTransaction: true,
  117. })
  118. if conn == "" || err != nil {
  119. logrus.Fatalf("mysql lost: %v", err)
  120. }
  121. // 读写分离
  122. err = db1.Use(dbresolver.Register(dbresolver.Config{
  123. Sources: []gorm.Dialector{mysql.Open(conn)},
  124. Replicas: []gorm.Dialector{mysql.Open(slave)},
  125. }))
  126. if slave == "" || err != nil {
  127. logrus.Fatalf("mysql dbresolver slaveString:%v, err: %v", slave, err)
  128. }
  129. sqlDB, err := db1.DB()
  130. if err != nil {
  131. logrus.Fatalf("mysql lost: %v", err)
  132. }
  133. sqlDB.SetMaxIdleConns(20)
  134. sqlDB.SetMaxOpenConns(50)
  135. sqlDB.SetConnMaxLifetime(2 * time.Hour)
  136. if index > 0 {
  137. GDBGroup[index] = db1
  138. }
  139. return db1
  140. }
  141. func initLoginDB() {
  142. connString := os.Getenv("MYSQL_LOGIN_DSN")
  143. newLogger := logger.New(
  144. log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
  145. logger.Config{
  146. SlowThreshold: time.Second, // Slow SQL threshold
  147. LogLevel: logger.Info, // Log level(这里记得根据需求改一下)
  148. IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
  149. Colorful: false, // Disable color
  150. },
  151. )
  152. db, err := gorm.Open(mysql.Open(connString), &gorm.Config{
  153. Logger: newLogger,
  154. SkipDefaultTransaction: true,
  155. })
  156. if connString == "" || err != nil {
  157. logrus.Fatalf("mysql lost: %v", err)
  158. }
  159. // 读写分离
  160. slaveString := os.Getenv("MYSQL_LOGIN_SLAVE_DSN")
  161. err = db.Use(dbresolver.Register(dbresolver.Config{
  162. Sources: []gorm.Dialector{mysql.Open(connString)},
  163. Replicas: []gorm.Dialector{mysql.Open(slaveString)},
  164. }))
  165. if slaveString == "" || err != nil {
  166. logrus.Fatalf("mysql dbresolver slaveString:%v, err: %v", slaveString, err)
  167. }
  168. sqlDB, err := db.DB()
  169. if err != nil {
  170. logrus.Fatalf("mysql lost: %v", err)
  171. }
  172. sqlDB.SetMaxIdleConns(20)
  173. sqlDB.SetMaxOpenConns(50)
  174. sqlDB.SetConnMaxLifetime(2 * time.Hour)
  175. LDB = db
  176. }
  177. // GetDBName 获取数据库库名
  178. func GetDBName(conn string) string {
  179. dsnConf, _ := mysql2.ParseDSN(conn)
  180. return dsnConf.DBName
  181. }
  182. func GetDBId(DB *gorm.DB) int {
  183. for k, db := range GDBGroup {
  184. if db == DB {
  185. return k
  186. }
  187. }
  188. return 0
  189. }