Mongo-java开发中的小问题

本文记录了在使用Java连接MongoDB时遇到的两个问题:1) 批量插入时由于重复ID导致的唯一性约束错误;2) 连接错误的MongoDB端口时,程序不会立即报错,而是在执行数据库操作时才抛出异常。这些问题在不同版本的MongoDB驱动中表现不一,开发者需要注意检查和验证连接的正确性。

在使用java连接MongoDB时,遇到了两个小小的问题,记录下来分享一下。
1 程序明明插入多个document,实际上数据库却只插入了一条记录。
在测试批量插入和单条插入的性能时,我写了这样的代码:

        String host="127.0.0.1";
        int port=27017;
        String dbName="test";MongoClient mongoClient=new MongoClient(host, port);
        MongoDatabase mongoDB=mongoClient.getDatabase(dbName);
        System.out.println("mongo connect succeed");
        Document document=new Document("title","MongoDB")
                .append("userName", "admin")
                .append("description", "DataBase");
        MongoCollection<Document> collection=mongoDB.getCollection("shit");
        List<Document> list=new ArrayList<Document>();
        for(int i=0;i<100;i++){
            list.add(document);
        }
        collection.insertMany(list);
        System.out.println("insert 100 documents?");

报了异常,查看异常信息:Write errors: [BulkWriteError{index=0, code=11000, message=’E11000 duplicate key error collection,显然这是由于我们只插入了一个文档,它生成了相同的id,导致主键冲突,数据写入失败。我现在用的是mongo驱动的3.2.2版本,在实际开发中使用的则是2.x版本的,在2.x版本中,这样的错误操作不会抛出异常,但实际上只插入了一条记录。所以使用2.x版本的人需要注意这个小小的错误,我当时直接懵了。第二天才发现问题。
2 在数据库连接阶段,不会报出任何异常。
回到上面的代码,我连接的是本地数据库,localhost:27017,如果我们将端口号改成27000这样的错误端口,执行程序,控制台输出如下:
三月 24, 2016 9:26:05 下午 com.mongodb.diagnostics.logging.JULLogger log
信息: Cluster created with settings {hosts=[127.0.0.1:27000], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout=’30000 ms’, maxWaitQueueSize=500}
mongo connect succeed
可以看到,即使在连接阶段,端口或者数据库地址错误,甚至是数据库关闭服务,都不会有错误提示,只有在对数据库执行具体操作,比如插入或者查询的时候,才会抛出Socket连接异常。所以我们在判断数据库连接是否成功时,需要执行一个具体操作才能得到正确结果。

第一篇Blog,希望之后能一直坚持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值