2016-09-26 72 views
4

我正在从java驱动程序2.12.3升级到3.3.0。奇怪的是,收集池似乎突然“动起来”了。如何保持连接池在mongodb上使用java驱动程序关闭?

我的设立如下:

连接建立在主线程:

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); 

它在数百个线程的使用:

org.bson.Document oldDoc = DBInteractions.readOneFromDb("articles"); 

使用的功能是这样的:

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

而对于每一个数据库交互,我得到这样的警告:

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. 

看起来好像连接池仅仅是一个互动后关闭。但为什么? 非常疑惑任何想法?

+2

没有真正的答案,但一个暗示:你应该有MongoClient作为共享对象,你只开提升一次并保持一生。 MongoDatabase对象不是线程安全的,不应该共享。 – mtj

回答

4

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); 
+1

这就是我整个下午所做的,以及我在这里问的原因。 ;)为更多的想法画空白。 –

+1

看看这是否有帮助 ' MongoClientOptions options = new MongoClientOptions.Builder()。socketKeepAlive(true).build(); } 并将此选项传递给 MongoClient client = new MongoClient(“host”,options);' –

+1

工程就像一个魅力,thx。 –

相关问题