java使用mongodb问题集

1.js和java语言差异性:

问题:

由于mongo是 一个js引擎,而很多目前应用采用的是java开发,由于js并非强语言类型,导致写入的json中如果包含数字时就会出现问题。

js认为数字是number类型,换言之,js的number类型对应的强类型语言的float,导致如果写入一个数据,用java转换为整形时会失败。

解决:

禁止使用js更新mongodb,sa在使用时只允许查询,不允许修改和添加


2.查询mongodb复制集没有分布读压力:

问题:

mongodb replicate sets架构,设置认证,开启slaveOk(),所有的读并没有分配到对应的secondary

解决:

由于mongodb自由在运行时设置的slaveOk()才有效,退后后就得重新设置。

因此在java代码中需要明确说明是否使用从库读,代码如下:

mongo.setReadPreference(ReadPreference.SECONDARY);
或者
db.setReadPreference(ReadPreference.SECONDARY);
或者更细力度,按自己需求定

3.maxBsonObjectSize

在应用开发时,我们往往可能设置进文档(document)的大小不一,但是mongodb服务器端设置了文档大小,对于早期版本是4M,对于后来设置为16M。

而驱动默认为4M,如果从服务器中获取过来数据,那么采用服务器端的数据。

java驱动获取最大bson数据代码如下:

int fetchMaxBsonObjectSize() {
        if (_masterPortPool == null)
            return 0;
        DBPort port = _masterPortPool.get();
        try {
            CommandResult res = port.runCommand(_mongo.getDB("admin"), new BasicDBObject("isMaster", 1));
            // max size was added in 1.8
            if (res.containsField("maxBsonObjectSize")) {
                _maxBsonObjectSize.set(((Integer) res.get("maxBsonObjectSize")).intValue());
            } else {
                _maxBsonObjectSize.set(Bytes.MAX_OBJECT_SIZE);
            }
        } catch (Exception e) {
            _logger.log(Level.WARNING, "Exception determining maxBSONObjectSize ", e);
        } finally {
            port.getPool().done(port);
        }

        return _maxBsonObjectSize.get();
    }

获取的maxBsonObjectSize的数据,只要修改服务器端的这个数据即可。

具体设置如下:




------
author: madding.lip
date: 2012.02.09


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值