1. 程式人生 > >Mongo-java開發中的小問題

Mongo-java開發中的小問題

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