错误一:
调用代码:
Exception in thread "main" com.mongodb.MongoException$Network: can't call something : /10.20.141.58:28018/test
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:227)
at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:305)
at com.mongodb.DB.command(DB.java:160)
at com.mongodb.DB.command(DB.java:183)
at com.mongodb.DB.command(DB.java:144)
at com.mongodb.DBCollection.mapReduce(DBCollection.java:1054)
at com.mongodb.DBCollection.mapReduce(DBCollection.java:1008)
at TestMongodb.main(TestMongodb.java:120)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at org.bson.io.Bits.readFully(Bits.java:35)
at org.bson.io.Bits.readFully(Bits.java:28)
at com.mongodb.Response.<init>(Response.java:39)
at com.mongodb.DBPort.go(DBPort.java:128)
at com.mongodb.DBPort.call(DBPort.java:79)
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:218)
... 7 more
解决方法:
错误2:
Out of semaphores to get db connection
查看源代码发现是连接池资源用尽:
但是,我明明是设置过了啊...
再仔细看了下初始化顺序,发现semaphore是在mongodb初始化的时候设置的。所以需要这样设置:
调用代码:
String map = "function() { emit(this.offer_price, {count:1});}";
String reduce = "function(key, values) {";
reduce = reduce + "var total = 0;";
reduce = reduce + "for(var i=0;i<values.length;i++){total += values[i].count;}";
reduce = reduce + "return {count:total};}";
String result = "resultCollection";
MapReduceOutput mapReduceOutput = coll.mapReduce(map, reduce.toString(), result, null);
DBCollection resultColl = mapReduceOutput.getOutputCollection();
DBCursor cursor = resultColl.find();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
Exception in thread "main" com.mongodb.MongoException$Network: can't call something : /10.20.141.58:28018/test
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:227)
at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:305)
at com.mongodb.DB.command(DB.java:160)
at com.mongodb.DB.command(DB.java:183)
at com.mongodb.DB.command(DB.java:144)
at com.mongodb.DBCollection.mapReduce(DBCollection.java:1054)
at com.mongodb.DBCollection.mapReduce(DBCollection.java:1008)
at TestMongodb.main(TestMongodb.java:120)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at org.bson.io.Bits.readFully(Bits.java:35)
at org.bson.io.Bits.readFully(Bits.java:28)
at com.mongodb.Response.<init>(Response.java:39)
at com.mongodb.DBPort.go(DBPort.java:128)
at com.mongodb.DBPort.call(DBPort.java:79)
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:218)
... 7 more
解决方法:
options.socketTimeout = 2000;
错误2:
Out of semaphores to get db connection
查看源代码发现是连接池资源用尽:
public DBPort get(){
DBPort port = null;
if ( ! _waitingSem.tryAcquire() )
throw new SemaphoresOut();
但是,我明明是设置过了啊...
MongoOptions options = m.getMongoOptions();
options.autoConnectRetry = true;
options.connectionsPerHost = 500;
options.maxWaitTime = 5000;
options.socketTimeout = 0;
options.connectTimeout = 15000;
options.threadsAllowedToBlockForConnectionMultiplier = 4;
再仔细看了下初始化顺序,发现semaphore是在mongodb初始化的时候设置的。所以需要这样设置:
MongoOptions options = new MongoOptions();
options.autoConnectRetry = true;
options.connectionsPerHost = 1000;
options.maxWaitTime = 5000;
options.socketTimeout = 0;
options.connectTimeout = 15000;
options.threadsAllowedToBlockForConnectionMultiplier = 5000;
m = new Mongo(new ServerAddress("10.20.141.22", 28018), options);