4

私は Java 用の Mongodb ドライバーを使用しようとしていますが、非常に散発的に発生するこのバグに非常に不満を感じていますが、最も一貫して発生するのは、最初にデータベースに接続しようとしたときに発生します。どこを見るべきかについての助けは信じられないほど役に立ちます。

基本的なセットアップは次のとおりです。Play 2.0 アプリを localhost で起動し、アプリにユーザーを登録しようとします。ユーザー名を入力すると、ユーザー名が存在するかどうかを確認するクエリがデータベースに送信されます。これには 1 秒かかります (おそらく 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]

ここで何が起こっているのか本当に理解できないので、どんな助けも大歓迎です.

これに光を当てるかもしれない1つの注意点は、保存されたオブジェクトにロードしようとするデータが多いほど、問題がより頻繁に発生していることです。

ありがとう!

4

0 に答える 0