MongoDB+Azure+Android: ошибка: com.mongodb.MongoException: не разговаривает с мастером и повторные попытки израсходованы

Фон:

У меня есть наборы реплик MongoDB, работающие в рабочей роли облачной службы Azure + веб-ролях, с использованием библиотеки mongo-azure . В первый раз, когда я настроил свой проект Android для подключения к MongoDB/Azure, ввод-вывод (чтение и запись) работал. Затем я разбил приложение из-за опечатки в моем жестко закодированном тестовом JSONString, поэтому экземпляр Mongo не смог правильно закрыться. После исправления этой проблемы с JSONString я получил следующую ошибку (в трассировке стека) и не смог получить доступ к MongoDB/Azure. Возможно, неправильное закрытие соединения вызвало ошибку?

Вопрос:

Что именно означает эта ошибка? Почему главный экземпляр недоступен?

E/AndroidRuntime: com.mongodb.MongoException: not talking to master and retries used up

Полная трассировка стека:

E/AndroidRuntime(6274): FATAL EXCEPTION: Thread-7108
E/AndroidRuntime(6274): Process: com.myproject.examplemongodb, PID: 6274
E/AndroidRuntime(6274): com.mongodb.MongoException: not talking to master and retries used up
E/AndroidRuntime(6274):     at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:271)
E/AndroidRuntime(6274):     at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:273)
E/AndroidRuntime(6274):     at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:273)
E/AndroidRuntime(6274):     at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:216)
E/AndroidRuntime(6274):     at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:288)
E/AndroidRuntime(6274):     at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:273)
E/AndroidRuntime(6274):     at com.mongodb.DB.getCollectionNames(DB.java:400)
E/AndroidRuntime(6274):     at com.myproject.examplemongodb.ActivityMain$1.run(ActivityMain.java:89)
E/AndroidRuntime(6274):     at java.lang.Thread.run(Thread.java:841)

Примечания:

  • Я использую новейший mongo-java-driver ( в настоящее время 2.11.3).
  • Я удаленно подключаюсь к базе данных (не локальный хост).
  • В другом вопросе упоминается эта ошибка, но OP использует разные драйверы, и его решение не работает для Android/Java.

Возможное решение:

  • It appears that closing the connection from the app allowed the next run to work properly. But, I'm still worried about being able allow concurrent connections, which I would definitely like to do.
    • Update: I have wrapped a mongodb log in and log out around each of my queries going to the server, but the error still seems to show up intermittently. So far, it seems that write work every time, but reads only work half the time. The other half of the time is the posted error.

person Anonsage    schedule 07.12.2013    source источник
comment
Вот следующая проблема MongoDB+Azure+Android из этой серии: ссылка   -  person Anonsage    schedule 08.12.2013


Ответы (1)


Причина периодических ошибок связана с настройками чтения по умолчанию для драйвера, в основном в отношении наборов реплик. Предпочтение чтения по умолчанию является первичным. Для каждого из режимов, упомянутых ниже, ПЕРВИЧНЫЙ относится к основной базе данных (всегда самой последней), а ВТОРИЧНЫЙ относится к ведомым, которые в основном являются копиями главного и не всегда актуальны.

PRIMARY: The default read mode. Read from primary only. Throw an error if
         primary is unavailable. Cannot be combined with tags.

Решение изменить предпочтение чтения на одно из следующих:

PRIMARY PREFERRED: Read from primary if available, otherwise a secondary.
SECONDARY PREFERRED: Read from a secondary if available, otherwise read from the primary.
NEAREST: Read from any member node from the set of nodes which respond the fastest.

Пример кода:

// Use this when doing a read if you don't care if the data is always consistent.
// Change the following with secondaryPreferred() if you have high writes, so
// that you don't interfere with them.
ReadPreference preference = ReadPreference.primaryPreferred();
DBCursor cur = new DBCursor(collection, query, null, preference);

Дополнительные сведения см. в источнике.

person Anonsage    schedule 07.12.2013