设为首页 收藏本站
查看: 1223|回复: 0

[经验分享] Java的MongoDB驱动及读写策略

[复制链接]

尚未签到

发表于 2015-7-8 09:04:13 | 显示全部楼层 |阅读模式
网上看见一篇博文,详细讲了MongoDB读写策略,将来生产会遇到类似的问题,转来备查。
指定新mongo实例:
Mongo m = new Mongo();
Mongo m = new Mongo( "localhost" );
Mongo m = new Mongo( "localhost" , 27017 );
// or, to connect to a replica set, supply a seed list of members
Mongo m = new Mongo(Arrays.asList(new ServerAddress("localhost", 27017),
                                      new ServerAddress("localhost", 27018),
                                      new ServerAddress("localhost", 27019)));
然后发起连接(必须指定数据库名,可以不存在)
DB db = m.getDB( "mydb" );

注意Mongo已经实现了连接池,并且是线程安全的。

大部分用户使用mongodb都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:
boolean auth = db.authenticate(myUserName, myPassword);

获取集合(collection)的名称列表(类似show databases):
Set colls = db.getCollectionNames();

获取一个集合(以便增删改查操作):
DBCollection coll = db.getCollection("testCollection")

-------------------------------------------------------------
先假设要插入的json数据如下:
{
   "name" : "MongoDB",
   "type" : "database",
   "count" : 1,
   "info" : {
               x : 203,
               y : 102
             }
}

将其插入数据库:
        BasicDBObject doc = new BasicDBObject();

        doc.put("name", "MongoDB");
        doc.put("type", "database");
        doc.put("count", 1);

        BasicDBObject info = new BasicDBObject();

        info.put("x", 203);
        info.put("y", 102);

        doc.put("info", info);

        coll.insert(doc);

-------------------------------------------------------------
设定write concern,以便操作失败时得到提示:
m.setWriteConcern(WriteConcern.SAFE);
-------------------------------------------------------------
查找一个/第一个记录:
DBObject myDoc = coll.findOne();
System.out.println(myDoc);

注意:属性名不能以下划线或者美元符号开始,mongodb自己保留。

获取总记录数:
System.out.println(coll.getCount());

使用游标操作查询结果:
        DBCursor cursor = coll.find();
        try {
            while(cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        } finally {
            cursor.close();
        }

条件查询:
        BasicDBObject query = new BasicDBObject();

        query.put("i", 71);

        cursor = coll.find(query);

        try {
            while(cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        } finally {
            cursor.close();
        }

如果想使用shell里的类似以下语句的功能:
db.things.find({j: {$ne: 3}, k: {$gt: 10} });
在java驱动里,{$ne: 3}也是一个普通的DBObject:
        BasicDBObject query = new BasicDBObject();

        query.put("j", new BasicDBObject("$ne", 3));
        query.put("k", new BasicDBObject("$gt", 10));

        cursor = coll.find(query);

        try {
            while(cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        } finally {
            cursor.close();
        }

条件查询一批数据:
以下是查询i > 50的记录:
        query = new BasicDBObject();

        query.put("i", new BasicDBObject("$gt", 50));  // e.g. find all where i > 50

        cursor = coll.find(query);

        try {
            while(cursor.hasNext()) {
                System.out.println(cursor.next());
            }
        } finally {
            cursor.close();
        }         
以下是查询20 < i

注意上面settings字段,我们定义了一个新的getLastErrorModes对象,键为DRSafe。当我们客户端采用此错误模式作为WriteConcern的时候,它会使写操作在完成前复制到至少两个节点上。下面是使用的例子:
//使用自定义的getLastErrorMode创建WriteConcern
WriteConcern concern = new WriteConcern("DRSafe");
//使用自定义的WriteConcern进行写操作
coll.insert(new BasicDBObject("name", "simple doc"), concern);

----------------------------
在优先读取策略(Read Preferences)中使用节点标记(Tags):

假如我们想要将读请求发送到最近的节点上以便减少请求延时:
DBObject query = new BasicDBObject("name", "simple doc")
DBObject result = coll.findOne(query, null, ReadPreference.nearest());
这样java驱动会自动将读请求发送到ping值最小的节点(也有可能是主节点)。

但是,如果我们的java驱动可以确定自己的请求发送源位置,那么就可以明确指定将读请求发送到距离最近的数据中心。再看上面的例子,假如这个读请求来自南加利福尼亚,我们就明确指定这个读请求到Los Angeles数据中心:
// initialize a properly tagged read preference
ReadPreference tagged_pref = ReadPreference.secondaryPreferred(new BasicDBObject("datacenter", "Los Angeles"));
// include the tagged read preference in this request}}
DBObject result = coll.findOne(}}
new BasicDBObject("name", "simple doc"), null, tagged_pref);

下面的例子指定多个tag,如果读请求在Los Angeles失败,则发送到"US_West"区域的某个节点:
// read from either LA or US_West
DBObject tagSetOne = new BasicDBObject("datacenter", "Los Angeles"):
DBObject tagSetTwo = new BasicDBObject("region", "US_West");
ReadPreference pref = ReadPreference.primaryPreferred(tagSetOne, tagSetTwo);

下面的例子同样指定多个tag,首先请求"datacenter=Los Angeles"且"rack=1"的节点,如果失败则查找"region=US_West"的节点
// read from either LA or US_West
DBObject tagSetOne = new BasicDBObject("datacenter", "Los Angeles");
tagSetOne.put("rack", "1");
DBObject tagSetTwo = new BasicDBObject("region", "US_West");
ReadPreference pref = ReadPreference.primaryPreferred(tagSetOne, tagSetTwo);

优先读取策略(Read Preferences)可以在operation, collection, DB, Mongo, MongoOptions, MongoURI各个级别来设置,而且设置会以slaveOK和WriteConcer类似的方式来继承。
优先读取策略(Read Preferences)在支持主从复制的服务器上(1.6+)都可以使用。
在优先读取策略(Read Preferences)中使用节点标记(Tags)在所有支持节点标记的服务器(2.0+)都可以使用。
在分片(shard)上使用节点标记(Tags),必须是2.2+版本的服务器才可以。

转自 http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84362-1-1.html 上篇帖子: 认识MongoDB 下篇帖子: mongodb学习(六)索引
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表