mgo_config.go 4.0 KB

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