MongoDB Java Driver 3.8版本如何配置连接超时相关参数?
解决方案
1. 正确绑定SocketSettings到MongoClient
你可以通过MongoClientSettings.Builder内置的applyToSocketSettings方法直接注入超时配置,修改后的初始化代码如下:
CodecRegistry pojoCodecRegistry = fromRegistries(com.mongodb.MongoClient.getDefaultCodecRegistry(), fromProviders(PojoCodecProvider.builder().automatic(true).build())); MongoCredential credential = MongoCredential.createCredential(theuser, database, thepassword.toCharArray()); MongoClientSettings settings = MongoClientSettings.builder() .credential(credential) .codecRegistry(pojoCodecRegistry) .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress(addr, 27017)))) // 注入Socket超时配置 .applyToSocketSettings(builder -> builder.connectTimeout(60, TimeUnit.SECONDS) // 建议同时配置读取超时,避免查询长时间卡住 .readTimeout(60, TimeUnit.SECONDS) ) .build(); MongoClient client = MongoClients.create(settings);
如果你已经单独实例化了SocketSettings对象,也可以直接调用builder的socketSettings(socketOptions)方法传入即可。
2. 排查偶发超时核心根因
MongoClient本身是线程安全的,全局仅需要初始化1次,复用同一个实例即可。如果你的代码在每次JSP页面请求、Servlet调用时都重复创建MongoClient实例,会导致频繁创建销毁数据库连接,页面重载、并发量稍高的场景下就会频繁出现超时问题,这是当前场景下最常见的诱因。
你可以将MongoClient实例放在Servlet上下文、全局单例容器中管理,启动应用时初始化一次,所有请求复用即可。
3. 额外优化配置建议
你还可以根据应用负载配置连接池参数,进一步降低超时概率:
MongoClientSettings settings = MongoClientSettings.builder() .credential(credential) .codecRegistry(pojoCodecRegistry) .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress(addr, 27017)))) .applyToSocketSettings(builder -> builder.connectTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) ) // 配置连接池参数 .applyToConnectionPoolSettings(builder -> // 最大连接数按需调整,默认是100 builder.maxSize(200) // 连接获取超时时间 .maxWaitTime(30, TimeUnit.SECONDS) ) .build();
内容的提问来源于stack exchange,提问作者Rafael Santos
相关产品推荐
相关产品推荐

