mongodb打开连接问题

我的mongo控制台中有以下日志:

Tue Jul 23 17:20:01.301 [initandlisten] waiting for connections on port 27017 Tue Jul 23 17:20:01.401 [websvr] admin web console waiting for connections on port 28017 Tue Jul 23 17:20:01.569 [initandlisten] connection accepted from 127.0.0.1:58090 #1 (1 connection now open) Tue Jul 23 17:20:01.570 [initandlisten] connection accepted from 127.0.0.1:58089 #2 (2 connections now open) Tue Jul 23 17:20:21.799 [initandlisten] connection accepted from 127.0.0.1:58113 #3 (3 connections now open) .... .... .... 

同样,日志继续,现在它在112.每次当我启动mongo服务器时,这种情况发生。 我的代码中只有一个单例连接。 这可能是什么问题:

 public static DB getConnection(String databaseName) throws AppConnectionException { if (null != db) { Logger.debug("Returning existing db connection...!"); return db; } Logger.debug("Creating new db connection...!"); final String connStr = PropertyRetreiver.getPropertyFromConfigurationFile("rawdata.url"); try { final MongoClientURI uri = new MongoClientURI(connStr); final MongoClient client = new MongoClient(uri); db = client.getDB(databaseName); } catch (UnknownHostException e) { throw new AppConnectionException( "Unable to connect to the given host / port."); } return db; } 

MongoClient有内部连接池。 可以配置最大连接数(默认值为100)。 你可以使用像这样的MongoClientOptions来设置它:

 MongoClientOptions options = MongoClientOptions.builder() .connectionsPerHost(100) .autoConnectRetry(true) .build(); 

然后将这些选项提供给MongoClient(在Mongo Java API v2.11.1中进行检查)。 池中的连接保持打开(打开和关闭连接通常是一项昂贵的操作),以便以后可以重用它们。

我还会使用enum重构您的MongoDB客户端单例,以避免在此方法上进行synchronized

这是我的意思草图:

 public enum MongoDB { INSTANCE; private static final String MONGO_DB_HOST = "some.mongohost.com"; private Mongo mongo; private DB someDB; MongoDB() { MongoClientOptions options = MongoClientOptions.builder() .connectionsPerHost(100) .autoConnectRetry(true) .readPreference(ReadPreference.secondaryPreferred()) .build(); try { mongo = new MongoClient(MONGO_DB_HOST, options); } catch (UnknownHostException e) { e.printStackTrace(); } someDB = mongo.getDB("someDB"); //authenticate if needed //boolean auth = someDB.authenticate("username", "password".toCharArray()); //if(!auth){ // System.out.println("Error Connecting To DB"); //} } public DB getSomeDB() { return someDB; } //call it on your shutdown hook for example public void close(){ mongo.close(); } } 

然后,您可以通过访问您的数据库

 MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count();