Mongo-java开发中的小问题

来源:互联网 发布:java将信息写入文件 编辑:程序博客网 时间:2024/06/01 08:13

在使用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,希望之后能一直坚持

0 0