Mongodb Java驱动程序无法偶尔读取数据,套接字超时

时间:2012-05-23 23:48:21

标签: java mongodb playframework-2.0 socket-timeout-exception

我正在尝试使用Mongodb驱动程序用于java,我对这个非常零星的错误感到非常沮丧,尽管最常见的是,当我第一次尝试连接数据库时,它会出现。任何寻求帮助的帮助都会非常有帮助。

设置基本上是这样的:我在localhost上启动我的Play 2.0应用程序,我尝试在我的应用程序上注册用户。当我输入用户名时,会向数据库发送一个查询以检查用户名是否存在,这需要一秒钟(可能是实例化Mongo单例并连接到数据库的开销)但似乎有效,我可以成功执行多个查询这样:

public static boolean usernameIsAvailable(String username){
    DBCollection users = DBManager.getDB("mojulo").getCollection("users");
    DBCursor cursor = users.find(new BasicDBObject("username", username));
    if(cursor.count() == 0)
        return true;
    return false;
}

然后当我尝试插入用户时出现问题(总共大约2kb的数据):

BasicDBObject new_user = new BasicDBObject();
new_user.put("username", username);
...
//connect to the database
DBCollection users = DBManager.getDB("mojulo").getCollection("users");

//check if the email is already registered
DBCursor cursor = users.find(new BasicDBObject("email", email));
if(cursor.count() != 0){
    emailIsRegistered = true;
}

//check if the username is available
if(!usernameIsAvailable(username)){
    usernameIsTaken = true;
}

//if the email or username are taken, return null
if(emailIsRegistered || usernameIsTaken){
    System.out.println("failed to create user:" + username);
    return null;
}
WriteResult result = users.insert(new_user);
if(result.getLastError().ok()){
    System.out.println("successfully created user:" + username);
    return userRandomKey;
}else return null;

这种偶然失败,但在if(result.getLastError().ok())行上往往会失败。我不能真正打败这个问题,因为它会随机弹出。这是堆栈跟踪通常的样子:

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[Network: can't call something : ds033307.mongolab.com/107.20.129.238:33307/heroku_app4620908]]
at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:82) [play_2.9.1.jar:2.0]
at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:63) [play_2.9.1.jar:2.0]
at akka.actor.Actor$class.apply(Actor.scala:290) [akka-actor.jar:2.0]
at play.core.ActionInvoker.apply(Invoker.scala:61) [play_2.9.1.jar:2.0]
at akka.actor.ActorCell.invoke(ActorCell.scala:617) [akka-actor.jar:2.0]
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:179) [akka-actor.jar:2.0]

Caused by: com.mongodb.MongoException$Network: can't call something : ds033307.mongolab.com/107.20.129.238:33307/heroku_app4620908
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:227) ~[mongo-java-driver-2.7.3.jar:na]
at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:305) ~[mongo-java-driver-2.7.3.jar:na]
at com.mongodb.DB.command(DB.java:160) ~[mongo-java-driver-2.7.3.jar:na]
at com.mongodb.DB.command(DB.java:183) ~[mongo-java-driver-2.7.3.jar:na]
at com.mongodb.DBCollection.getCount(DBCollection.java:864) ~[mongo-java-driver-2.7.3.jar:na]
at com.mongodb.DBCollection.getCount(DBCollection.java:835) ~[mongo-java-driver-2.7.3.jar:na]

Caused by: java.net.SocketException: Operation timed out
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.6.0_31]
at java.net.SocketInputStream.read(SocketInputStream.java:129) ~[na:1.6.0_31]
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) ~[na:1.6.0_31]
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) ~[na:1.6.0_31]
at java.io.BufferedInputStream.read(BufferedInputStream.java:317) ~[na:1.6.0_31]
at org.bson.io.Bits.readFully(Bits.java:35) ~[mongo-java-driver-2.7.3.jar:na]

任何帮助都会非常感激,因为我无法弄清楚这里发生了什么,而更有经验的人可能会知道在哪里看。

可能也可以说明问题的一个注意事项是,我尝试加载到保存对象中的数据越多,问题就越频繁发生。

谢谢!

0 个答案:

没有答案