mgo_config.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package mgodb
  2. import (
  3. "context"
  4. "eta/eta_api/utils"
  5. "github.com/qiniu/qmgo"
  6. "github.com/qiniu/qmgo/options"
  7. "go.mongodb.org/mongo-driver/bson"
  8. "go.mongodb.org/mongo-driver/event"
  9. mgoptions "go.mongodb.org/mongo-driver/mongo/options"
  10. "sync"
  11. )
  12. var (
  13. ConnectTimeoutMS = int64(3000)
  14. SocketTimeoutMS = int64(500000)
  15. MaxPoolSize = uint64(50)
  16. MinPoolSize = uint64(0)
  17. )
  18. //func init() {
  19. // fmt.Println("start MgoNewClient")
  20. // MgoNewClient()
  21. // fmt.Println("end MgoNewClient")
  22. //}
  23. type MgoConfig struct {
  24. Host string `json:"host"`
  25. Port string `json:"port"`
  26. Username string `json:"username"`
  27. Password string `json:"password"`
  28. AuthSource string `json:"authSource"`
  29. Database string `json:"database"`
  30. }
  31. // MgoNewClient
  32. // @Description: 创建一个mongodb客户端链接
  33. // @author: Roc
  34. // @datetime 2024-04-25 14:01:14
  35. // @return *qmgo.Client
  36. func MgoNewClient(mgoConfig MgoConfig) *qmgo.Client {
  37. // 创建cmdMonitor,用于打印SQL
  38. //startedCommands := make(map[int64]bson.Raw)
  39. startedCommands := sync.Map{} // map[int64]bson.Raw
  40. cmdMonitor := &event.CommandMonitor{
  41. Started: func(_ context.Context, evt *event.CommandStartedEvent) {
  42. startedCommands.Store(evt.RequestID, evt.Command)
  43. //startedCommands[evt.RequestID] = evt.Command
  44. },
  45. Succeeded: func(_ context.Context, evt *event.CommandSucceededEvent) {
  46. //log.Printf("Command: %v Reply: %v\n",
  47. // startedCommands[evt.RequestID],
  48. // evt.Reply,
  49. //)
  50. var commands bson.Raw
  51. v, ok := startedCommands.Load(evt.RequestID)
  52. if ok {
  53. commands = v.(bson.Raw)
  54. }
  55. //utils.MongoLog.Info("\n【MongoDB】[%.3fms] [%v] %v \n", float64(evt.Duration)/1e6, commands, evt.Reply)
  56. utils.MongoLog.Info("\n【MongoDB】[%.3fms] [%v] \n", float64(evt.Duration)/1e6, commands)
  57. },
  58. Failed: func(_ context.Context, evt *event.CommandFailedEvent) {
  59. //log.Printf("Command: %v Failure: %v\n",
  60. // startedCommands[evt.RequestID],
  61. // evt.Failure,
  62. //)
  63. var commands bson.Raw
  64. v, ok := startedCommands.Load(evt.RequestID)
  65. if ok {
  66. commands = v.(bson.Raw)
  67. }
  68. utils.MongoLog.Info("\n【MongoDB】[%.3fms] [%v] \n %v \n", float64(evt.Duration)/1e6, commands, evt.Failure)
  69. },
  70. }
  71. // 创建options
  72. ops := options.ClientOptions{ClientOptions: &mgoptions.ClientOptions{}}
  73. ops.SetMonitor(cmdMonitor)
  74. ctx := context.Background()
  75. //mongodb+srv://myDatabaseUser:D1fficultP%40ssw0rd@mongodb0.example.com/?authSource=admin&replicaSet=myRepl
  76. var mongoUrl string
  77. if mgoConfig.Password != "" {
  78. mongoUrl = "mongodb://" + mgoConfig.Username + ":" + mgoConfig.Password + "@" +
  79. mgoConfig.Host + ":" + mgoConfig.Port
  80. if mgoConfig.AuthSource != `` {
  81. mongoUrl += mongoUrl + "?&authSource=" + mgoConfig.AuthSource
  82. }
  83. } else {
  84. mongoUrl = "mongodb://" + mgoConfig.Host + ":" + mgoConfig.Port
  85. }
  86. // 创建一个数据库链接
  87. client, err := qmgo.NewClient(ctx, &qmgo.Config{
  88. Uri: mongoUrl,
  89. Database: mgoConfig.Database,
  90. ConnectTimeoutMS: &ConnectTimeoutMS,
  91. SocketTimeoutMS: &SocketTimeoutMS,
  92. MaxPoolSize: &MaxPoolSize,
  93. MinPoolSize: &MinPoolSize,
  94. }, ops)
  95. if err != nil {
  96. panic("MongoDB连接异常:" + err.Error())
  97. }
  98. return client
  99. }
  100. func MgoGetColl(collName string) (cli *qmgo.QmgoClient, err error) {
  101. ctx := context.Background()
  102. config := &qmgo.Config{
  103. //Uri: MGO_URL,
  104. //Database: MGO_DB,
  105. Coll: collName,
  106. ConnectTimeoutMS: &ConnectTimeoutMS,
  107. SocketTimeoutMS: &SocketTimeoutMS,
  108. MaxPoolSize: &MaxPoolSize,
  109. MinPoolSize: &MinPoolSize,
  110. }
  111. cli, err = qmgo.Open(ctx, config)
  112. return
  113. }