求解:持续触发com.mongodb.MongoSocketReadException异常原因
com.mongodb.MongoSocketReadException: Prematurely reached end of stream异常的常见原因及针对你的代码的建议 Hey there, let's break down why you might be hitting this MongoSocketReadException and how to check against your code setup:
隐藏的连接字符串格式错误
先看你的连接URI——末尾多了个\n换行符:MongoClientURI uri = new MongoClientURI("mongodb+srv://USERNAME:MYPASSWORD@database-yyc55.mongodb.net/test\n", options_builder);这个不起眼的换行符会导致驱动解析连接地址时出错,无法正常和MongoDB集群建立稳定连接,直接触发流提前结束的异常。建议立刻删掉这个
\n,确保连接字符串是干净的纯文本。连接空闲时间设置过短
你配置了maxConnectionIdleTime(60000)(也就是1分钟),如果你的业务访问频率较低,空闲连接可能还没被客户端回收,就先被MongoDB服务器(比如Atlas集群)主动关闭了。当客户端复用这个失效连接时,就会抛出这类流异常。可以尝试把这个值调大,比如设置成5分钟(300000毫秒),或者根据你的业务请求频率来适配。补充连接池的超时参数
目前你只设置了空闲连接时间,建议加上连接超时和Socket超时的配置,避免连接过程中因网络波动导致的无响应:options_builder.connectTimeout(10000) // 10秒连接超时 .socketTimeout(30000); // 30秒读写超时这能让驱动在连接或读写出现问题时更快抛出明确异常,也减少无效连接占用资源的情况。
CodecRegistry的兼容性验证
你用了自动PojoCodecProvider,虽然它直接触发Socket异常的概率不高,但如果你的实体类不符合Pojo序列化要求(比如没有默认构造函数、字段访问权限不足),可能会在序列化/反序列化时阻塞连接,间接导致连接被服务器关闭。可以暂时切换回默认CodecRegistry测试,看异常是否消失,以此排除Codec的影响。网络与集群兼容性检查
这个异常也常出现在网络不稳定的场景:比如防火墙拦截了MongoDB端口、DNS解析异常,或者MongoDB集群节点切换。你可以先用MongoDB Compass手动连接集群,确认网络通畅;另外检查你的MongoDB驱动版本是否和集群版本兼容(比如集群是5.0+的话,驱动建议用4.0以上版本)。
建议你按照「先修复URI换行符→调整空闲时间→补充超时参数→验证Codec→检查网络/版本」的顺序逐步排查,应该能定位到问题。
内容的提问来源于stack exchange,提问作者royashcenazi

