如何在mongodb上使用java驱动程序保持连接池关闭?

And*_*ard 5 java connection multithreading connection-pooling mongodb

我正在从java驱动程序2.12.3升级到3.3.0.奇怪的是,收集池似乎突然"起作用".

我的设置如下:

Connection在主线程中建立:

mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost:27017"));
mongoClient.setWriteConcern(new WriteConcern(0, 10)); // deprecated, replace soon
database = mongoClient.getDatabase("Example");
// java.util.logging.Logger.getLogger("org.mongodb.driver").setLevel(Level.SEVERE);
Run Code Online (Sandbox Code Playgroud)

它用于数百个线​​程:

org.bson.Document oldDoc = DBInteractions.readOneFromDb("articles");
Run Code Online (Sandbox Code Playgroud)

使用这样的函数:

static synchronized Document readOneFromDb(String col) {
    return database.getCollection(col).find().limit(1).sort(new Document().append("count", 1)).first();
}
Run Code Online (Sandbox Code Playgroud)

对于每次数据库交互,我都会收到这样的警告:

Sep 26, 2016 2:33:19 PM com.mongodb.diagnostics.logging.JULLogger log
INFORMATION: Closed connection [connectionId{localValue:42, serverValue:248}] to localhost:27017 because the pool has been closed.
Run Code Online (Sandbox Code Playgroud)

看起来好像连接池仅在一次交互后关闭.但为什么?很困惑任何一个想法?

sat*_*ati 6

https://api.mongodb.com/java/3.1/com/mongodb/MongoClientOptions.html

看看链接.有几种方法可以帮助你.查看连接连接池的超时相关方法.


编辑:添加了正确的答案(它在下面的评论中)

MongoClientOptions options = new MongoClientOptions.Builder().socketKeepAlive(true).build(); 
MongoClient client = new MongoClient("host", options);
Run Code Online (Sandbox Code Playgroud)