package test;
|
|
import com.mongodb.BasicDBObject;
|
import com.mongodb.DBCollection;
|
import com.mongodb.DBObject;
|
import com.mongodb.Mongo;
|
import com.mongodb.MongoClient;
|
|
import java.io.IOException;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Random;
|
|
public class TestMongoDB {
|
public static final String DOC_ID = "docId";
|
public static final String VALUE = "value";
|
public static final String DB_NAME = "db1";
|
public static final String UNIQUE = "unique";
|
public static final String BACKGROUND = "background";
|
private DBCollection col1;
|
private DBCollection col2;
|
|
private static DBCollection getCollection(Mongo mongo, String collectionName) {
|
DBCollection col = mongo.getDB(DB_NAME).getCollection(collectionName);
|
BasicDBObject index = new BasicDBObject();
|
index.append(DOC_ID, 1);
|
DBObject indexOptions = new BasicDBObject();
|
indexOptions.put(UNIQUE, true);
|
indexOptions.put(BACKGROUND, true);
|
col.createIndex(index, indexOptions);
|
return col;
|
}
|
|
private static void storeDoc(String docId, DBObject doc, DBCollection dbCollection) throws IOException {
|
BasicDBObject query = new BasicDBObject();
|
query.put(DOC_ID, docId);
|
dbCollection.update(query, doc, true, false);
|
//dbCollection.findAndModify(query, null, null, false, doc, false, true);
|
}
|
|
public static void main(String[] args) throws Exception{
|
final String value = new String(new char[1000000]).replace('\0', 'a');
|
Mongo mongo = new MongoClient("localhost:27017");
|
final TestMongoDB testMongoDB = new TestMongoDB();
|
testMongoDB.col1 = getCollection(mongo, "col1");
|
testMongoDB.col2 = getCollection(mongo, "col2");
|
|
fillUpCollection(testMongoDB.col1, value, 0, 300);
|
//restart Database, comment out previous line, and run again
|
fillUpCollection(testMongoDB.col2, value, 0, 2000);
|
updateExistingDocuments(testMongoDB, value);
|
}
|
|
private static void updateExistingDocuments(TestMongoDB testMongoDB, String value) {
|
List<String> docIds = new ArrayList<String>();
|
for(int i = 0; i < 10; i++) {
|
docIds.add(new Random().nextInt(300) + "");
|
}
|
multiThreadUpdate(testMongoDB.col1, value, docIds);
|
}
|
|
|
private static void multiThreadUpdate(final DBCollection col, final String value, final List<String> docIds) {
|
Runnable worker = new Runnable() {
|
@Override
|
public void run() {
|
try {
|
System.out.println("Started Thread");
|
for(String id : docIds) {
|
storeDoc(id, getDbObject(value, id), col);
|
}
|
} catch (Exception e) {
|
System.out.println(e);
|
} finally {
|
System.out.println("Completed");
|
}
|
}
|
};
|
|
for(int i = 0; i < 8; i++) {
|
new Thread(worker).start();
|
}
|
}
|
|
private static DBObject getDbObject(String value, String docId) {
|
final DBObject object2 = new BasicDBObject();
|
object2.put(DOC_ID, docId);
|
object2.put(VALUE, value);
|
return object2;
|
}
|
|
private static void fillUpCollection(DBCollection col, String value, int from, int to) throws IOException {
|
for(int i = from ; i <= to; i++) {
|
storeDoc(i + "", getDbObject(value, i + ""), col);
|
}
|
}
|
}
|