MongoDB Java Driver 源码分析(2):com.mongodb.Mongo
程序员文章站
2022-03-02 16:17:01
...
Mongo 表示一个数据库实例,可能包含多个 ServerAddress 和多个 DB。
本文将介绍 Mongo 类中的三个重要方法:构造方法,获取所有数据库的名称,通过名称获取指定的数据库
实现如下:
涉及的其他类:
ServerAddress 用于保存主机名和所使用的端口的信息
MongoOptions 用于保存查询设置(是否在 Slave 上进行查询,超时设置等)
WriteConcern 写入参数设置,包括:Server 数量,写入超时设置,是否立即将结果同步到文件系统中
DBTCPConnector 表示 TCP 数据连接,后续文章中将详细介绍。
DBCleanerThread 清理线程,每隔一段时间清理各个DB 的 DBCursor
实现如下:
涉及的其他类:
BasicDBObject 与 MongoDB 交互时使用的数据结构,实际相当于 Java 中的 Map,或 JavaScript 中的 object
CommandResult 操作执行的结果,继承 BasicDBObject,提供一些便捷的方法,实际仍然是在 DBObject 中查询相应的属性。
实现如下:
涉及的其他类:
DBApiLayer 该类继承 DB 类。实现底层的 DB 操作,通过 Mongo 对象间接调用。将在后续的文章中进行详细的介绍。
本文将介绍 Mongo 类中的三个重要方法:构造方法,获取所有数据库的名称,通过名称获取指定的数据库
构造方法
实现如下:
// 构造方法 // replicaSetSeeds 所有 Server 的地址 // options 默认的查询设置 public Mongo( List<ServerAddress> replicaSetSeeds , MongoOptions options ) throws MongoException { // 设置类变量 _addr = null; _addrs = replicaSetSeeds; _options = options; // 应用查询设置 _applyMongoOptions(); // 创建 TCP 连接实例 _connector = new DBTCPConnector( this , _addrs ); // 启动数据清理线程 _cleaner = new DBCleanerThread(); _cleaner.start(); } // 应用查询设置 void _applyMongoOptions() { // 是否在 Slave Server 上执行查询 if (_options.slaveOk) slaveOk(); // 应用默认的写入设置 setWriteConcern( _options.getWriteConcern() ); } // 应用默认的写入设置 public void setWriteConcern( WriteConcern concern ){ _concern = concern; }
涉及的其他类:
ServerAddress 用于保存主机名和所使用的端口的信息
MongoOptions 用于保存查询设置(是否在 Slave 上进行查询,超时设置等)
WriteConcern 写入参数设置,包括:Server 数量,写入超时设置,是否立即将结果同步到文件系统中
DBTCPConnector 表示 TCP 数据连接,后续文章中将详细介绍。
DBCleanerThread 清理线程,每隔一段时间清理各个DB 的 DBCursor
获取所有数据库的名称
实现如下:
// 获取所有数据库的名称 public List<String> getDatabaseNames() throws MongoException { // 创建表示数据库命令的 DBOBject BasicDBObject cmd = new BasicDBObject(); cmd.put("listDatabases", 1); // 使用 admin 数据库执行命令并返回结果 CommandResult res = getDB( "admin" ).command(cmd, getOptions()); // 有错误的情况下抛出异常 res.throwOnError(); // 获取结果中的 databases 属性,即数据库列表 List l = (List)res.get("databases"); // 遍历 databases,将名称保存到一个 list 中,并返回结果 List<String> list = new ArrayList<String>(); for (Object o : l) { list.add(((BasicDBObject)o).getString("name")); } return list; }
涉及的其他类:
BasicDBObject 与 MongoDB 交互时使用的数据结构,实际相当于 Java 中的 Map,或 JavaScript 中的 object
CommandResult 操作执行的结果,继承 BasicDBObject,提供一些便捷的方法,实际仍然是在 DBObject 中查询相应的属性。
获取指定数据库的引用
实现如下:
// 通过名称获取指定的数据库 public DB getDB( String dbname ){ // _dbs 是一个用于缓存结果的 Map (名称 => DB) // 先在缓存中查询以节省时间 DB db = _dbs.get( dbname ); if ( db != null ) return db; // 缓存中不存在,则创建新的 DB 实例 db = new DBApiLayer( this , dbname , _connector ); DB temp = _dbs.putIfAbsent( dbname , db ); if ( temp != null ) return temp; return db; }
涉及的其他类:
DBApiLayer 该类继承 DB 类。实现底层的 DB 操作,通过 Mongo 对象间接调用。将在后续的文章中进行详细的介绍。
推荐阅读
-
MongoDB Java Driver 源码分析
-
MongoDB Java Driver 源码分析(9):com.mongodb.DBport
-
MongoDB Java Driver 源码分析(11):GridFS 类
-
MongoDB Java Driver 源码分析(13):OutputBuffer,BasicOutputBuffer 和 PoolOutputBuffer
-
MongoDB Java Driver 源码分析(1):Package 概述
-
MongoDB Java Driver 源码分析(12):GridFSFile、GridFSDBFile 和 GridFSInputFile
-
MongoDB Java Driver 源码分析(5):com.mongodb.DB
-
MongoDB Java Driver 源码分析(8):com.mongodb.RelicaSetStatus
-
MongoDB Java Driver 源码分析(7):com.mongodb.DBAPILayer
-
MongoDB Java Driver 源码分析(10):com.mongodb 总结