最近的一个项目弃用了mysql作为主要数据库,而改用了非关系型数据库MongoDB。之前初步了解过mongodb,在使用上面还算容易上手能相到的需求也基本可以满足, 但是唯独事物处理方面 麻烦的很,不过在18年的11月左右 mongo推出了4.0版本,添加了对事物的支持。 这两天反复查阅了很多资料 ,终于是实现了效果 在这里整理记录下。
首先是项目环境: windows7操作系统,java1.8, (在官网下载的msi版本,注意安装时 不要勾选 窗体工具选项,否则会安装的非常慢), Robo3T mongo很好用的窗体工具。
主要maven配置:
org.springframework.boot spring-boot-starter-parent 1.5.13.RELEASE org.springframework.boot spring-boot-starter-data-mongodb org.mongodb mongodb-driver org.mongodb mongo-java-driver 3.8.0
第一步,要搭建mongoDB副本集, 这是最重要的一步, 事物的实现 要基于mongo副本集群才能实现。否则在单机环境下直接去使用事物会报错
1. 在安装好的下创建config配置文件 我的安装路径是( C:\Program Files\MongoDB\Server\4.0\bin ),在该目录下创建副本的配置文件 分别是【 master.cfg 主节点, slave.cfg 从节点, arbiter.cfg 仲裁节点 】 这里贴下文件内容:
'这里要注意下,文件中列出的路径和文件必须存在 且可以自行定义'
-
# master.cfgstorage: dbPath: D:\MongoDb\matserdb journal: enabled: true engine: wiredTigersystemLog: destination: file logAppend: true path: D:\MongoDb\matserlog\MongoDb.lognet: port: 27111 bindIp: 127.0.0.1,192.168.1.123 replication: replSetName: mongo
-
# slave.cfgstorage: dbPath: D:\MongoDb\slavedb journal: enabled: true engine: wiredTigersystemLog: destination: file logAppend: true path: D:\MongoDb\slavelog\MongoDb.lognet: port: 27112 bindIp: 127.0.0.1,192.168.1.123 replication: replSetName: mongo
-
# arbiter.cfgstorage: dbPath: D:\MongoDb\arbiterdb journal: enabled: true engine: wiredTigersystemLog: destination: file logAppend: true path: D:\MongoDb\arbiterlog\MongoDb.lognet: port: 27113 bindIp: 127.0.0.1,192.168.1.123 replication: replSetName: mongo
2. 在上述文件配置完成后, 在bin目录下打开cmd窗口, 分别启动mongo节点。启动步骤一样,下面只拿masterdb举例 注意在启动成功后要另起窗口再启动另一端口服务。
-
mongod --config "masterdb.cfg"
'执行过上述语句后的窗体的状态如下'
为确保执行成功, 确认下日志文件是否打印正常, 正常内容的最后一段应该是 [ Connecting to 127.0.0.1:27113 ], 这时我们就可以通过Robo3T测试下是否启动成功,如链接失败,检查下是否有操作不一致的地方,排查问题
3. 在启动成功三个节点服务后, 要将节点关联。 同样 在bin目录下 另启动一cmd窗口,顺序执行
mongo -port 27111
rs.initiate({ _id: "mongo",version: 1,members: [{_id:0,host:"127.0.0.1:27111"},{_id:1,host:"127.0.0.1:27112"},{_id:2,host:"127.0.0.1:27113"}]})
如执行成功则会打印
'执行上述方法没有发现问题后,检查下执行是否成功':
rs.status() ,执行后打印类似以下json返回值
health:1 //1表明状态是正常,0表明异常
state:1 // 1表明是primary,2表明是slave,即做备份的机器
在上述操作执行完成后, 表示基本节点创建成功, 可以进行测试:
因为我是用项目代码测试的, 所以只在这里贴下关键代码, 其他关于springmongodb资料请自行查找。
这里的主要代码是有 try 里面的内容, 其他并不重要
测试执行 触发异常:
检查结果 插入数据为0 测试成功:
再次测试 注释掉
成功插入两条数据 测试成功:
参考文章:
https://blog.csdn.net/wanght89/article/details/77677271
https://segmentfault.com/a/1190000016955301?utm_source=tag-newest