springboot项目中关系型数据库与mongoDB并用是否能提升性能?
作者:mmseoamin日期:2024-04-27

这里写自定义目录标题

  • 1. springboot项目集成mongodb
    • 1.1 Maven添加依赖
    • 1.2 配置连接参数
    • 2. 代码实现增删改查
      • 2.1 创建实体类
      • 2.2 dao层、service层、controller层代码
      • 2.3 接口测试(postman)
      • 3. 思考:为什么要集成mongoDB, 哪些业务场景适合切到mongoDB?

        1. springboot项目集成mongodb

        这里默认前提是安装并启动了mongoDB服务,安装教程参考:mongoDB7.0.6版安装与使用(最新版踩坑记录)

        1.1 Maven添加依赖

        在pox.xml文件中添加spring-boot-starter-data-mongodb引用

        
            org.springframework.boot
            spring-boot-starter-data-mongodb
        
        

        1.2 配置连接参数

        springboot项目中关系型数据库与mongoDB并用是否能提升性能?,在这里插入图片描述,第1张

        一般都配置到nacos服务中,我这里在bootstrap.yml配置,配置时要注意缩进!通过上面两个步骤springBoot集成MongoDB环境就已经搭建好了,下面开始写代码

        2. 代码实现增删改查

        2.1 创建实体类

        public class UserTest {
            @Id
            private String id;
            //性别
            private String gender;
            //姓名
            private String name;
            @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
            private Date updateTime;
            ...getter  ....setter......
            }
        

        注意:mongo默认用UTC时区存储时间格式数据,而我们是东八区时间GMT+8,用navicat查看默认时间是UTC的(比系统时间少8小时),所以我加了上述JsonFormat注解,这样查出来的时间跟存入的是一样的,具体怎么修改时区暂不讨论

        因篇幅有限,mongoDB的常用命令也一并略过。

        2.2 dao层、service层、controller层代码

        Dao层一般就是通过注入MongoTemplate来实现实体对象的增删改查操作,但是如果有很多实体对象,每个都写一遍CRUD就很麻烦,我们先写一个通过反射生成的基类Dao,实现对象的save/delete/queryall/queryone/update/upsert等方法。

        //以下是简化的代码,根据类名可以搜到更全的。。。
        public abstract class MongoDbDao {
            protected Logger logger = LoggerFactory.getLogger(MongoDbDao.class);
            /**
             * 反射获取泛型类型
             *
             * @return
             */
            protected abstract Class getEntityClass();
            @Autowired
            private MongoTemplate mongoTemplate;
            /***
             * 保存一个对象
             * @param t
             */
            public void save(T t) {
                logger.info("-------------->MongoDB save start");
                this.mongoTemplate.save(t);
            }
            // 还有其他方法省略了
           }
        

        然后在不同的业务场景下继承该类MongoDbDao,通过泛型和反射获取到正在操作的实体类。

        本文中用的userTest实体对应的dao文件如下:

        @Repository
        public class UserTestMongoDbDao extends MongoDbDao {
            @Override
            protected Class getEntityClass() {
                return UserTest.class;
            }
        }
        

        service层即注入dao文件实现具体业务逻辑:

        @Service
        public class MongoDbService {
            @Autowired
            private UserTestMongoDbDao userTestMongoDbDao;
            /**
             * 保存对象
             * @return
             */
            public String saveObj(UserTest user) {
                System.out.println("--------------------->[MongoDB save start]");
                userTestMongoDbDao.save(user);
                return "添加成功";
            }
            public List findAll() {
                System.out.println("--------------------->[MongoDB save start]");
                return userTestMongoDbDao.queryList(new UserTest());
            }
        }
        

        controller代码:

        @RestController
        public class mongoController {
            @Autowired
            private MongoDbService mongoDbService;
            @PostMapping("/mongo/save")
            public String saveObj(@RequestBody UserTest user) {return mongoDbService.saveObj(user);}
            @GetMapping("/mongo/findAll")
            public List findAll() {return mongoDbService.findAll();}
        

        2.3 接口测试(postman)

        springboot项目中关系型数据库与mongoDB并用是否能提升性能?,在这里插入图片描述,第2张

        注意:

        1.Headers选项中要增加Authorization参数,key=Authorization,value需要在登录系统后通过F12控制台查看任意请求的Authorization参数。

        2.这里的updateTime参数是获取的系统时间,以下两行代码写到Pre-request Script选项:

        updateTime=Math.round(new Date().getTime());

        postman.setGlobalVariable(“updateTime”,updateTime);

        数据插入成功后可以通过postman发送http://127.0.0.1:8080/eam/mongo/findAll请求查询数据,也可以通过navicat工具直接看。

        3. 思考:为什么要集成mongoDB, 哪些业务场景适合切到mongoDB?

        如果是小型项目,可以直接切换到mongoDB,但是对于规模较大的项目==(用户量用户超过3-5万算大吗这个标准不确定啊)== 肯定离不开关系型数据库。那么问题来了,对于一个使用了关系型数据库进行开发且已上线的信息化系统,哪些业务适合切到monggoDB进行处理呢?

        可能不同的业务场景需要考虑多种因素,对于笔者的信息化系统来说,我想到了以下几个场景可能适合(尚未测试验证):

        1. 批量插入数据,数据量较多出现卡顿的情况, 可以把数据先存入mongDB,然后通过定时任务把数据移动到原关系型业务数据库;
        2. 日志存储:日志不涉及事务且数据量较大,可以考虑全存入mongDB,无需同步;
        3. 文件管理:系统的文件、照片、视频等非结构化数据,可以考虑全存入mongDB。

        希望有经验的朋友给提点一下,这三个场景切换到mongo能提升性能吗,还有其他场景适合做切换吗,做过类似测试的大神请留下您的宝贵经验!我也会继续做各种数据测试对这个想法进行验证