2016-11-29 35 views
1

我想開發一個使用MongoDB作爲數據庫的java項目。 我有2種方法(螺紋,無螺紋)如何在不創建新的mongodb連接的情況下插入文檔?

//myMongoHelper, for connection 
    //mydbhelper, threaded insertion 

    myMongoHelper m = new myMongoHelper("localhost",27017,"mydb","mycoll"); 
    int id=100; 
    Thread t = new Thread(new mydbhelper(new BasicDBObject())); 
    while(id>0){ 
     t.start(); 
     t = new Thread(new mydbhelper(new BasicDBObject())); 
     id--; 
    } 
    t.join(); 
    m.myclose(); 

 int id =100; 
     mongoClient = new MongoClient("localhost" , 27017); 
     DBCollection coll = mongoClient.getDB("mydb").getCollection("mycoll"); 
     while(id>0){ 
      coll.insert(new BasicDBObject()); 
      id--; 
     } 
     mongoClient.close(); 

$的mongod殼示出XX的連接現在打開同時的執行代碼,並默認它終止所有Java執行結束時的連接。

所以我想知道,

  1. 打開連接MongoDB的影響數據庫,以及如何?
  2. 是否可以在插入後終止線程以減少連接的數量?
  3. 線程更適合專門用於插入的mongodb操作嗎?

請改善我的代碼。

回答

0

我將把它們全部回答在一起,每一個新的連接都需要大量的資源才能初始化,因此儘量保持它們儘可能低。

而不是爲每個線程創建一個新的連接,使用單個連接並分發您的查詢!你可以用這種方式分發你的查詢!也可以使用批量插入以插入大量的文檔。

DBCollection coll = mongoClient.getDB("mydb").getCollection("mycoll"); 
    ArrayList<BasicDBObject> dbos = new ArrayList<BasicDBObject>(); 
    while(id>0){ 
     dbs.add(new BasicDBObject()); 
     id--; 
    } 
    coll.insert(dbos); 
+0

注意:my while循環是一個虛擬方法,其中我決定插入文檔的值。我的價值取決於不能提前預測的時間。 – Belhe001

+0

正如您在第二段中所解釋的,我的線程方法使用myMongoHelper創建只有1個連接。我的mydbhelper使用對象m以線程方式插入。我們在想什麼? PLZ提供示例代碼。 – Belhe001

+0

檢查代碼! DBCollection.insert接受DBObject類型的參數,列表或用於一次插入多個文檔的DBObjects數組。 –

相關問題