如何在C#项目中配置全局单例MongoDB连接
MongoDB单例连接实现方案(C# 驱动2.12.2适用)
MongoDB官方C#驱动中,
MongoClient本身是线程安全类型,官方推荐全应用生命周期内仅保留一个实例,即可实现连接池复用,避免重复创建客户端带来的资源损耗。
原有的Web.config配置无需修改,直接复用即可,仅需要修改连接管理类和业务调用逻辑:
步骤1:改造DBConnection为单例连接管理类
使用C#自带的Lazy<T>实现线程安全的懒加载单例,避免多请求并发场景下重复创建实例:
using System.Configuration; using MongoDB.Driver; namespace MyProj.DataAccess.Implementations { internal class DBConnection { // 懒加载初始化MongoClient,默认线程安全 private static readonly Lazy<MongoClient> _mongoClient = new Lazy<MongoClient>(() => new MongoClient(ConnectionString)); // 懒加载初始化业务库实例 private static readonly Lazy<IMongoDatabase> _mongoDatabase = new Lazy<IMongoDatabase>(() => _mongoClient.Value.GetDatabase(DatabaseName)); // 读取配置属性 private static string ConnectionString => ConfigurationManager.ConnectionStrings["MongoConnection"].ConnectionString; private static string DatabaseName => ConfigurationManager.AppSettings["MongoDBDatabase"].ToString(); // 对外暴露的单例入口,业务层直接调用即可 public static IMongoDatabase Database => _mongoDatabase.Value; // 如有单独操作客户端的需求可额外暴露Client实例 public static MongoClient Client => _mongoClient.Value; } }
步骤2:改造业务DAL调用逻辑
不再每次方法内创建MongoClient,直接复用单例连接即可:
using MongoDB.Driver; using System.Collections.Generic; using System.Linq; namespace MyProj.DataAccess.Implementations { public class UserDAL: IUserDAL { // 可提前初始化集合对象,也可以在方法内按需获取 private readonly IMongoCollection<UserTbl> _userCollection = DBConnection.Database.GetCollection<UserTbl>("UserTbls"); public List<UserTbl> GetAll() { return _userCollection.AsQueryable().ToList(); } } }
注意事项
- 不要手动调用
MongoClient的Dispose方法,单例实例的生命周期和应用保持一致,应用退出时会自动释放资源 - 可以在连接字符串中按需调整连接池配置,比如添加
maxPoolSize=200调整最大连接数适配高并发场景 - 该实现对2.12.2版本驱动完全兼容,不需要升级驱动版本
内容的提问来源于stack exchange,提问作者Aneesh S
相关产品推荐
相关产品推荐

