MongoDB Java Driver 源码分析(2):com.mongodb.Mongo _JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > MongoDB Java Driver 源码分析(2):com.mongodb.Mongo

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

 2011/11/5 10:02:55  裴小星  http://xxing22657-yahoo-com-cn.iteye.com  我要评论(0)
  • 摘要:Mongo表示一个数据库实例,可能包含多个ServerAddress和多个DB。本文将介绍Mongo类中的三个重要方法:构造方法,获取所有数据库的名称,通过名称获取指定的数据库。构造方法实现如下://构造方法//replicaSetSeeds所有Server的地址//options默认的查询设置publicMongo(List<ServerAddress>replicaSetSeeds,MongoOptionsoptions)throwsMongoException
  • 标签:
  Mongo 表示一个数据库实例,可能包含多个 ServerAddress 和多个 DB。
  本文将介绍 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 对象间接调用。将在后续的文章中进行详细的介绍。
  • 相关文章
发表评论
用户名: 匿名