运行太多的测试时失去与mongoDB的连接

4
当运行过多使用本地测试数据库的JUnit测试时,我在MongoDb上遇到了问题。当我逐个运行所有测试用例时,一切正常,每个测试用例都通过了。但是当我尝试“运行所有测试”时,在第80个测试之后,我失去了与Mongo的连接,所有接下来的测试都失败了。这很奇怪,因为我理解并看到“运行所有测试”只是使所有测试按顺序运行。在每个测试的@After中,我删除了我的数据库,所以我认为为每个测试创建自己独特的数据库可能会解决问题(之前使用的是单个数据库)。但事实并非如此,我仍然在80多个测试之后失去了连接(每次都不同)。也许驱动程序在某些时候没有足够的时间从Mongo获得响应,导致失败?我使用的是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 

你的连接断了吗? - interlude
1
@插曲,抱歉 :) 当然是输了。 感谢更正。 - liptonshmidt
你能发布一下MongoDB服务器在失败期间的日志吗?它是独立的吗?分片的吗?还是副本集?异常看起来像是服务器突然断开了连接(例如,服务器崩溃)。 - Rob Moore
1个回答

2
看起来我找到了问题所在。我们测试客户端中有一个愚蠢的错误:每个测试用例都创建了一个新的Mongo对象!命令:

db.serverStatus().connections

显示可用连接数量约为 200,但每个新的Mongo实例将创建新的10(默认)连接。因此,我简单地超出了限制,如日志所示(例如,您可以通过执行 mongo --eval="printjson(db.adminCommand({ getLog:'global' }))" 来阅读它们)。
解决方案是创建工厂类,该类保留Mongo对象的单个实例,该实例在每个测试用例中使用(我还在这里初始化DB和MongoClient实例,并建议您如果需要它们也这样做)。
我强烈建议阅读此主题,它解决了类似的问题(并对我很有帮助!):Mongo opens too many connections 感谢@RobMoore和@interlude的即时回复和乐于助人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接