MongoDB Java Driver 源码分析(2):com.mongodb.Mongo

  Mongo 表示一个数据库实例,可能包含多个 ServerAddress 和多个 DB。
  本文将介绍 Mongo 类中的三个重要方法:构造方法,获取所有数据库的名称,通过名称获取指定的数据库

[size=medium][align=center][b]构造方法[/b][/align][/size]
  实现如下:

// 构造方法
// 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;
}

  涉及的其他类:
  [b]ServerAddress[/b] 用于保存主机名和所使用的端口的信息
  [b]MongoOptions[/b] 用于保存查询设置(是否在 Slave 上进行查询,超时设置等)
  [b]WriteConcern[/b] 写入参数设置,包括:Server 数量,写入超时设置,是否立即将结果同步到文件系统中
  [b]DBTCPConnector[/b] 表示 TCP 数据连接,后续文章中将详细介绍。
  [b]DBCleanerThread[/b] 清理线程,每隔一段时间清理各个DB 的 DBCursor

[size=medium][align=center][b]获取所有数据库的名称[/b][/align][/size]
  实现如下:

// 获取所有数据库的名称
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;
}

  涉及的其他类:
  [b]BasicDBObject[/b] 与 MongoDB 交互时使用的数据结构,实际相当于 Java 中的 Map,或 JavaScript 中的 object
  [b]CommandResult[/b] 操作执行的结果,继承 BasicDBObject,提供一些便捷的方法,实际仍然是在 DBObject 中查询相应的属性。

[size=medium][align=center][b]获取指定数据库的引用[/b][/align][/size]
  实现如下:

// 通过名称获取指定的数据库
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;
}

  涉及的其他类:
  [b]DBApiLayer[/b] 该类继承 DB 类。实现底层的 DB 操作,通过 Mongo 对象间接调用。将在后续的文章中进行详细的介绍。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值