最近的一个项目弃用了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"}]})
    如执行成功则会打印

Mongodb3 副本集 springboot mongodb副本集_mongodb

    '执行上述方法没有发现问题后,检查下执行是否成功':

rs.status()  ,执行后打印类似以下json返回值
            health:1   //1表明状态是正常,0表明异常
            state:1     // 1表明是primary,2表明是slave,即做备份的机器

    

Mongodb3 副本集 springboot mongodb副本集_数据库_02

在上述操作执行完成后, 表示基本节点创建成功, 可以进行测试:

因为我是用项目代码测试的, 所以只在这里贴下关键代码, 其他关于springmongodb资料请自行查找。

这里的主要代码是有 try 里面的内容, 其他并不重要

Mongodb3 副本集 springboot mongodb副本集_数据库_03

 

测试执行 触发异常:

Mongodb3 副本集 springboot mongodb副本集_数据库_04

检查结果 插入数据为0 测试成功:

Mongodb3 副本集 springboot mongodb副本集_mongodb_05

再次测试 注释掉

Mongodb3 副本集 springboot mongodb副本集_mongodb_06

成功插入两条数据 测试成功:

Mongodb3 副本集 springboot mongodb副本集_Mongodb3 副本集_07