[重学Golang]09-连接 mongodb

992 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

长连接和短连接

首先了解下长连接和短连接原理和机制:

  • 长连接:建立一个长期的连接,每次有请求时只需取出来直接使用
  • 短连接:每次来一个请求时创建一个连接,使用完后请求结束则断开连接

具体的使用还是需要根据场景来分析,如果连接使用很低频的场景就不适合长连接,短连接就很合适且简单,不需要做连接的管理。对于频繁使用连接场景,短连接会频繁创建和销毁连接也会影响程序的性能,同时长连接的缺点也很明显,我们需要管理连接。

连接池

个人认为,无论是长连接还是短连接,使用关系型数据库,都可以通过使用连接池来提供分配,管理和释放数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

连接池可以在程序启动时创建足够的数据库连接,并将这些连接组成一个连接池。程序需要使用时可以动态的对池中的连接进行申请、使用和释放。如果程序并发请求时需要多于连接池的连接数,则需要在请求队列中排队等待。程序管理连接池时应根据连接使用率,动态增加或减少连接池中的连接数。

构建 mongodb 连接

获取包

go get go.mongodb.org/mongo-driver/mongo

创建连接

func initMongoDB() *mongo.Client {
  ctx := context.TODO()
  opts := options.Client().ApplyURI("your_mongodb_url")
​
  MongoClient, err := mongo.Connect(ctx, opts)
  if err != nil {
    println("mongodb 连接失败")
    panic(err)
  }
​
  err = MongoClient.Ping(ctx, nil)
  if err == nil {
    println("mongodb 连接成功")
  }
  return MongoClient
}

创建了 mongodbClient 后就可以进行相关的 CRUD 操作。如对执行的数据集进行操作

db := MongoCli.Database("your_db_name")
​
collection := db.Collection("your_collection_name")
data := models.Users{"Jhonny", 18}
res, err := collection.InsertOne(context.TODO(), data)

处理完任务后通过命令断开连接

MongoCli.Disconnect(context.Background())

构建 mongodb 连接池

连接池的作用就是为了提供性能,在池中存有已经创建好的连接,当有请求过来时直接使用已创建好的连接,这样可以省略创建连接和销毁连接的过程,从而提供性能。

如果自己设计一个连接池,那么需要考虑问题:

  • 创建连接池对象,程序启动时创建指定数量的连接
  • 当有请求过来时,直接从连接池中得到连接池。如果连接池对象没有空闲的连接且连接数没有达到最大,则创建一个连接,如果达到最大,则设定一定的超时时间,来获取连接
  • 执行连接访问服务
  • 访问服务完成后,释放连接。释放并非真正释放而是将其放在空闲队列中,当空闲连接数大于初识空闲连接数则释放连接

以下是 mongodb 连接池模式

func MongoDBPool() (*mongo.Database, error) {
  ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  defer cancel()
​
  opts := options.Client().ApplyURI(mongoUri)
  // 设置最大连接数 -默认100, 不设置最大是64
  opts.SetMaxPoolSize(50)
  client, err := mongo.Connect(ctx, opts)
  if err != nil {
    return nil, err
  }
​
  return client.Database("using"), nil
}