最近的一个项目弃用了mysql作为主要数据库,而改用了非关系型数据库MongoDB。之前初步了解过mongodb,在使用上面还算容易上手能相到的需求也基本可以满足, 但是唯独事物处理方面 麻烦的很,不过在18年的11月左右 mongo推出了4.0版本,添加了对事物的支持。 这两天反复查阅了很多资料 ,终于是实现了效果 在这里整理记录下。
首先是项目环境: windows7操作系统,java1.8, MongoDB4.0.5 (在官网下载的msi版本,注意安装时 不要勾选 窗体工具选项,否则会安装的非常慢), Robo3T mongo很好用的窗体工具。
主要maven配置:
• <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/>
</parent>
• <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<exclusions>
<exclusion>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.0</version>
</dependency>
第一步,要搭建mongoDB副本集, 这是最重要的一步, 事物的实现 要基于mongo副本集群才能实现。否则在单机环境下直接去使用事物会报错
1. 在安装好的下创建config配置文件 我的安装路径是( C:\Program Files\MongoDB\Server\4.0\bin ),在该目录下创建副本的配置文件 分别是【 master.cfg 主节点, slave.cfg 从节点, arbiter.cfg 仲裁节点 】 这里贴下文件内容:
'这里要注意下,文件中列出的路径和文件必须存在 且可以自行定义'
# master.cfg
storage:
dbPath: D:\MongoDb\matserdb
journal:
enabled: true
engine: wiredTiger
systemLog:
destination: file
logAppend: true
path: D:\MongoDb\matserlog\MongoDb.log
net:
port: 27111
bindIp: 127.0.0.1,192.168.1.123
replication:
replSetName: mongo
# slave.cfg
storage:
dbPath: D:\MongoDb\slavedb
journal:
enabled: true
engine: wiredTiger
systemLog:
destination: file
logAppend: true
path: D:\MongoDb\slavelog\MongoDb.log
net:
port: 27112
bindIp: 127.0.0.1,192.168.1.123
replication:
replSetName: mongo
# arbiter.cfg
storage:
dbPath: D:\MongoDb\arbiterdb
journal:
enabled: true
engine: wiredTiger
systemLog:
destination: file
logAppend: true
path: D:\MongoDb\arbiterlog\MongoDb.log
net:
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 测试成功:
再次测试 注释掉
成功插入两条数据 测试成功: