我在我的web应用程序中使用spring-data-mongodb(1.7.0.RELEASE)和spring-webmvc框架。我正在使用mongoRepository使用基本的CRUD函数,但我没有在我的代码中关闭mongo连接因为我认为spring-data-mongodb将自己关闭它,但它继续打开新连接而不是关闭它们。这些太多的连接都会导致我的应用程序崩溃,我不得不一次又一次地重启tomcat(每天两次)来克服这个问题。
注意:Spring Application& mongod在同一台服务器上。 这是崩溃后的日志 -
2015-07-17T01:31:20.068-0400 I NETWORK [conn3645] end connection 127.0.0.1:55302 (2583 connections now open)
2015-07-17T01:31:20.071-0400 I NETWORK [conn1713] end connection 127.0.0.1:48174 (2352 connections now open)
2015-07-17T01:31:20.072-0400 I NETWORK [conn2250] end connection 127.0.0.1:51017 (2325 connections now open)
2015-07-17T01:31:20.072-0400 I NETWORK [conn2149] end connection 127.0.0.1:50670 (2320 connections now open)
这是重启tomcat后的日志
2015-07-17T01:31:29.994-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:53599 #3984 (1 connection now open)
2015-07-17T01:31:33.263-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:53740 #3985 (2 connections now open)
2015-07-17T01:31:33.580-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:53750 #3986 (3 connections now open)
2015-07-17T02:10:06.477-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:50086 #3987 (4 connections now open)
2015-07-17T02:10:06.590-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:50090 #3988 (5 connections now open)
2015-07-17T02:10:11.682-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:50242 #3989 (6 connections now open)
2015-07-17T02:10:11.780-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:50244 #3990 (7 connections now open)
2015-07-17T02:10:12.545-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:50255 #3991 (8 connections now open)
2015-07-17T02:10:12.605-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:50258 #3992 (9 connections now open)
2015-07-17T02:10:13.413-0400 I NETWORK [initandlisten] connection accepted from 127.0.0.1:50299 #3993 (10 connections now open)
只要我向应用发送请求,它就会增加。
这是崩溃后的tomcat日志 -
Jul 16, 2015 3:59:57 PM org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
SEVERE: Socket accept failed
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404)
at java.net.ServerSocket.implAccept(ServerSocket.java:545)
at java.net.ServerSocket.accept(ServerSocket.java:513)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:222)
at java.lang.Thread.null(Unknown Source)
它是一个开发服务器,它的流量小于每分钟10次。
有人请建议我应该如何关闭这些连接?
答案 0 :(得分:3)
Spring不会自动关闭连接。仅当上下文关闭时,它才会关闭连接。
看看this article。
最好按照article
配置mongo选项但您必须根据应用程序流量微调这些值。
<beans>
<mongo:mongo host="localhost" port="27017">
<mongo:options connections-per-host="8"
threads-allowed-to-block-for-connection-multiplier="4"
connect-timeout="1000"
max-wait-time="1500}"
auto-connect-retry="true"
socket-keep-alive="true"
socket-timeout="1500"
slave-ok="true"
write-number="1"
write-timeout="0"
write-fsync="true"/>
</mongo:mongo/>
</beans>
答案 1 :(得分:2)
MongoClient维护一个连接池,你用MongoClient打开一次Db连接并在你的应用程序中重复使用它,因为设置一个新的TCP连接是时间和内存方式的EXPENSIVE,这就是重用连接的原因。此外,新连接将导致使用Db上的内存在MongoDB上创建新的线程。
答案 2 :(得分:2)
我也遇到了同样的问题,因为使用new而不是autowiring,如果你手动这样做,请使用
关闭连接 mongoDBObject.getDB().getMongo().close().
答案 3 :(得分:1)
Spring-data-mongodb使用连接池来重用连接,因此它不会关闭连接,并在下次重用它。为此,您需要创建mongo类的单例实例。
如果使用Spring IOC创建Mono-repository实例(使用@AutoWired),它可以正常工作原因它返回单例实例,因此一次只返回少量连接。但是我没有使用@Autowired创建存储库实例我正在通过新方法手动创建它们,所以每次都给我新的mongo()实例。 new mongo instance表示与db的新连接。并且没有办法关闭它。这就是为什么我有太多开放的连接。