Spring Mongo加@Transactional报错 如何配置Mongo副本集及调整AWS集群设置
你遇到的com.mongodb.MongoClientException: Transactions are not supported by the MongoDB cluster to which this client is connected异常根因是:MongoDB仅在副本集、分片集群模式下支持事务功能,你当前使用的单节点极简部署模式默认不支持事务。你现有Spring配置中已经正确注入了MongoTransactionManager,配置类无需修改,只需调整Mongo端环境和连接参数即可。
单节点极简Mongo环境配置副本集步骤
单节点副本集无高可用能力,但可满足本地开发测试使用事务的需求,操作步骤如下:
- 停止当前运行的MongoDB进程
- 编辑MongoDB配置文件(默认路径为
/etc/mongod.conf),添加副本集配置:
replication: replSetName: rs0 # 可自定义副本集名称
- 重启MongoDB服务:
systemctl restart mongod - 执行
mongosh进入Mongo Shell,运行初始化命令:
rs.initiate({ _id: "rs0", // 和配置文件中的副本集名称保持一致 members: [ { _id: 0, host: "127.0.0.1:27017" } // 填写你Mongo实例的访问地址 ] })
- 执行
rs.status()确认副本集状态,返回结果中myState字段值为1即代表主节点初始化完成 - 修改Spring项目中Mongo连接URI,添加副本集参数,示例:
原URI:mongodb://127.0.0.1:27017/hendrix
修改后:mongodb://127.0.0.1:27017/hendrix?replicaSet=rs0
AWS平台Mongo集群支持事务的配置修改
AWS上部署Mongo集群分为两种常见场景,对应配置调整如下:
场景1:使用AWS托管DocumentDB(兼容MongoDB协议)
- 确认DocumentDB集群版本≥4.0,低于该版本需先升级集群版本
- 调整集群参数组中
transaction_lifetime_limit参数,按需设置事务最大存活时间,默认值为60秒 - 连接URI需开启TLS(DocumentDB默认强制TLS校验)并添加副本集参数,示例:
mongodb://<账号>:<密码>@<DocumentDB集群端点>:27017/hendrix?replicaSet=rs0&tls=true&tlsCAFile=global-bundle.pem - 确认DocumentDB所属安全组已放开应用服务器访问27017端口的权限
场景2:在EC2上自行部署MongoDB集群
- 所有Mongo节点所属安全组需互相放开27017端口的出入站权限,同时放开应用服务器的访问权限
- 每个Mongo节点的配置文件中
bind_ip参数不能仅绑定127.0.0.1,需修改为节点私有IP或0.0.0.0,确保集群节点之间可正常通信 - 副本集初始化时
members的host字段填写EC2私有IP或内部域名,不可使用127.0.0.1 - Spring项目连接URI填写所有副本集成员地址,示例:
mongodb://<节点1私有IP>:27017,<节点2私有IP>:27017,<节点3私有IP>:27017/hendrix?replicaSet=rs0&readPreference=primaryPreferred
内容的提问来源于stack exchange,提问作者diaop
相关产品推荐
相关产品推荐

