分布式服务器框架之Server.Common MongoDBClient类封装MongoClient 使用双重检验锁检验初始化单例

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: MongoClient是连接MongoDB数据库的中间件,在使用MongoClient类之前要从NuGet里面安装MongoDB.Bson、MongoDB.Driver、MongoDB.Driver.Core 三个包后才能使用完整的功能。

MongoClient是连接MongoDB数据库的中间件,在使用MongoClient类之前要从NuGet里面安装MongoDB.Bson、MongoDB.Driver、MongoDB.Driver.Core 三个包后才能使用完整的功能。


和上一篇文章要写的东西基本上差不多。自己封装的MongoDBClient代码量很少,基本原理就是在MongoClient的基础上封装了一层,使用xml配置里的ServerConfig.MongoConnectionString去New了一个MongoClient,然后把ip地址和端口端口构造函数就可以了。


要强调的一点是,单例实例化的过程中考虑到了多线程并发的情况,所以使用了双重检验锁这里判断两次的目的主要是:线程1和线程2同时进入外层的==null逻辑,线程2跑的比线程1块很多,线程2执行了lock(lock_obj),然后走完了初始化,完成后离开了lock块,然后解锁lock_obj对象;线程1才走到判断lock_obj有没有被锁上,这时候线程2结果了,线程1判断应该是没有锁上,会锁上lock_obj,进入lock中的代码块,如果这时候不加m_CurrClient==null,导致的结果 是会 初始化两次m_CurrClient。


贴出来代码:


using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Text;
namespace Servers.Common
{
    class MongoDBClient
    {
        private static object lock_obj = new object();
        /// <summary>
        /// 中间件的客户端
        /// </summary>
        private static MongoClient m_CurrClient = null;
        public static MongoClient CurrClient
        {
            get 
            {
                if (null == lock_obj)
                {
                    lock (lock_obj)
                    {
                        if (null == lock_obj)
                        {
                            m_CurrClient = new MongoClient(ServerConfig.MongoConnectionString);
                        }
                    }
                }
                return m_CurrClient;
            }
        }
    }
}


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
1天前
|
JSON 中间件 数据格式
在服务器框架中处理 POST 请求
在服务器框架中处理 POST 请求
在自定义服务器框架中处理 GET 请求
在自定义服务器框架中处理 GET 请求
|
1天前
|
JSON 中间件 数据格式
在自定义服务器框架中处理 POST 请求
在自定义服务器框架中处理 POST 请求
|
1天前
|
资源调度
在 Next.js 中使用自定义服务器框架进行服务器端渲染
在 Next.js 中使用自定义服务器框架进行服务器端渲染
Next.js 的服务器端渲染框架集成
Next.js 的服务器端渲染框架集成
|
1天前
|
存储 Java 分布式数据库
【分布式计算框架】HBase数据库编程实践
【分布式计算框架】HBase数据库编程实践
12 1
|
1天前
|
分布式计算 并行计算 Java
【分布式计算框架】 MapReduce编程初级实践
【分布式计算框架】 MapReduce编程初级实践
9 2
|
1天前
|
分布式计算 数据可视化 Hadoop
【分布式计算框架】HDFS常用操作及编程实践
【分布式计算框架】HDFS常用操作及编程实践
4 1
|
1天前
|
NoSQL Java 关系型数据库
【Redis系列笔记】分布式锁
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路
126 2
|
1天前
|
监控 NoSQL 算法
探秘Redis分布式锁:实战与注意事项
本文介绍了Redis分区容错中的分布式锁概念,包括利用Watch实现乐观锁和使用setnx防止库存超卖。乐观锁通过Watch命令监控键值变化,在事务中执行修改,若键值被改变则事务失败。Java代码示例展示了具体实现。setnx命令用于库存操作,确保无超卖,通过设置锁并检查库存来更新。文章还讨论了分布式锁存在的问题,如客户端阻塞、时钟漂移和单点故障,并提出了RedLock算法来提高可靠性。Redisson作为生产环境的分布式锁实现,提供了可重入锁、读写锁等高级功能。最后,文章对比了Redis、Zookeeper和etcd的分布式锁特性。
129 16
探秘Redis分布式锁:实战与注意事项

热门文章

最新文章