Spring数据mongodb没有关闭mongodb连接

Viv*_*vex 5 mongodb mongo-java spring-data-mongodb

我正在为我的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)
Run Code Online (Sandbox Code Playgroud)

这是重启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)
Run Code Online (Sandbox Code Playgroud)

每当我向应用程序发送请求时它都会增加.

这是崩溃后的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)
Run Code Online (Sandbox Code Playgroud)

它是一个开发服务器,它的流量低于每分钟10个呼叫.

有人请建议我应该如何关闭这些连接?

小智 4

MongoClient 维护一个连接池,您使用 MongoClient 打开一次数据库连接,然后在应用程序中重复使用它,因为设置新的 TCP 连接在时间和内存方面都非常昂贵,这就是您重复使用连接的原因。此外,新连接将导致使用数据库上的内存在 MongoDB 上创建新线程。

  • 需要注意的是,connectToMongo 方法中存在竞争条件。您需要同步对该方法的访问,以确保最多创建一个 MongoClient 实例。