2013-09-13 3 views
4

У меня возникла проблема с MongoDb при запуске слишком большого количества тестов JUnit, которые используют мою локальную тестовую базу данных. Когда я выполняю все тесты один за другим, все в порядке, и каждый тест проходит. Но когда я пытаюсь «Запустить все тесты», где-то после 80-го теста я теряю связь с Монго, и все последующие тесты терпят неудачу. Странно, потому что, поскольку я понимаю и вижу, что «запускать все тесты» просто заставляет все тесты запускаться последовательно.Потеря связи с mongoDB при запуске слишком большого количества тестов

Я отбрасываю свой db в @ После каждого теста, поэтому я подумал, что, возможно, создание собственной уникальной базы данных для каждого теста может решить проблему (до того, как я использовал один). Но это не так. Я по-прежнему теряю связь после 80+ тестов (каждый раз каждый раз).

Возможно, у водителя не хватает времени, чтобы получить ответ от Монго в какой-то момент, и это приводит к сбою?

Я использую 2.11.3 драйвер Mongo Java. Нужна помощь. Спасибо.

Вот стек ошибка:

Sep 13, 2013 5:32:07 PM com.mongodb.DBTCPConnector initDirectConnection 
WARNING: Exception executing isMaster command on /127.0.0.1:27017 
java.io.EOFException 
    at org.bson.io.Bits.readFully(Bits.java:48) 
    at org.bson.io.Bits.readFully(Bits.java:33) 
    at org.bson.io.Bits.readFully(Bits.java:28) 
    at com.mongodb.Response.<init>(Response.java:40) 
    at com.mongodb.DBPort.go(DBPort.java:142) 
    at com.mongodb.DBPort.go(DBPort.java:106) 
    at com.mongodb.DBPort.findOne(DBPort.java:162) 
    at com.mongodb.DBPort.runCommand(DBPort.java:170) 
    at com.mongodb.DBTCPConnector.initDirectConnection(DBTCPConnector.java:547) 
    at com.mongodb.DBTCPConnector.isMongosConnection(DBTCPConnector.java:334) 
    at com.mongodb.Mongo.isMongosConnection(Mongo.java:618) 
    at com.mongodb.DB.wrapCommand(DB.java:282) 
    at com.mongodb.DB.command(DB.java:260) 
    at com.mongodb.DB.command(DB.java:244) 
    at com.mongodb.DB.command(DB.java:301) 
    at com.mongodb.DB.command(DB.java:199) 
    at com.mongodb.DB.dropDatabase(DB.java:557) 
    at com.*******.dbconnection.mongodb.BaseMongodbTest.tearDown(BaseMongodbTest.java:102) 
    at com.*******.rpcserver.methods.BaseTestClient.tearDown(BaseTestClient.java:57) 
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:36) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:24) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 




com.mongodb.MongoException$Network: Read operation to server /127.0.0.1:27017 failed on database test_mydb_fb19fd07-6e4f-4 
    at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:253) 
    at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:216) 
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:288) 
    at com.mongodb.DB.command(DB.java:262) 
    at com.mongodb.DB.command(DB.java:244) 
    at com.mongodb.DB.command(DB.java:301) 
    at com.mongodb.DB.command(DB.java:199) 
    at com.mongodb.DB.dropDatabase(DB.java:557) 
    at com.*******.dbconnection.mongodb.BaseMongodbTest.tearDown(BaseMongodbTest.java:102) 
    at com.*******.rpcserver.methods.BaseTestClient.tearDown(BaseTestClient.java:57) 
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:36) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:24) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: java.io.EOFException 
    at org.bson.io.Bits.readFully(Bits.java:48) 
    at org.bson.io.Bits.readFully(Bits.java:33) 
    at org.bson.io.Bits.readFully(Bits.java:28) 
    at com.mongodb.Response.<init>(Response.java:40) 
    at com.mongodb.DBPort.go(DBPort.java:142) 
    at com.mongodb.DBPort.call(DBPort.java:92) 
    at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:244) 
    ... 42 more 
+0

Вы теряете или теряете соединение? – interlude

+1

@interlude, извините :) Потеря, конечно. ty для коррекции. – liptonshmidt

+0

Можете ли вы опубликовать журнал, охватывающий период сбоя с сервера MongoDB? Это автономно? Sharded? Набор реплик? Исключение выглядит так, как сервер резко отключил соединение (например, сервер разбился). –

ответ

2

Кажется, что я узнал, где проблема. В нашем тестовом клиенте была глупая ошибка: для каждого теста был создан новый объект Mongo! Команда

db.serverStatus(). Соединения

показывает, что число доступных соединений составляет около 200, но каждый новый экземпляр Монго создает новый 10 (по умолчанию) соединений. Таким образом, я просто превысил этот предел, как это было показано в журналах (вы можете их прочитать, например, путем выполнения mongo --eval = "printjson (db.adminCommand ({getLog: 'global'}))")

Решение состоит в том, чтобы создать заводский класс, который хранит единый экземпляр объекта Mongo, который используется в каждом тестовом примере (я также инициализирую DB и экземпляры MongoClient здесь и рекомендую вам сделать то же самое, если они вам тоже нужны).

Я настоятельно рекомендую прочитать эту тему, она решает подобную проблему (и помогла мне много!): Mongo opens too many connections

Благодаря @RobMoore и @interlude для быстрых ответов и готовности помочь!

Смежные вопросы