0


springboot项目中关系型数据库与mongoDB并用是否能提升性能?

这里写自定义目录标题

1. springboot项目集成mongodb

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

1.1 Maven添加依赖

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

1.2 配置连接参数

在这里插入图片描述
一般都配置到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 classMongoDbDao<T>{protected Logger logger = LoggerFactory.getLogger(MongoDbDao.class);/**
     * 反射获取泛型类型
     *
     * @return
     */protected abstract Class<T>getEntityClass();

    @Autowired
    private MongoTemplate mongoTemplate;/***
     * 保存一个对象
     * @param t
     */publicvoidsave(T t){
        logger.info("-------------->MongoDB save start");this.mongoTemplate.save(t);}// 还有其他方法省略了}

然后在不同的业务场景下继承该类MongoDbDao,通过泛型和反射获取到正在操作的实体类。
本文中用的userTest实体对应的dao文件如下:

@Repository
public class UserTestMongoDbDao extends MongoDbDao<UserTest> {
    @Override
    protected Class<UserTest> 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<UserTest> findAll() {
        System.out.println("--------------------->[MongoDB save start]");
        return userTestMongoDbDao.queryList(new UserTest());
    }
}

controller代码:

@RestController
publicclassmongoController{
    @Autowired
    private MongoDbService mongoDbService;

    @PostMapping("/mongo/save")public String saveObj(@RequestBody UserTest user){return mongoDbService.saveObj(user);}

    @GetMapping("/mongo/findAll")public List<UserTest>findAll(){return mongoDbService.findAll();}

2.3 接口测试(postman)

在这里插入图片描述
注意:
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能提升性能吗,还有其他场景适合做切换吗,做过类似测试的大神请留下您的宝贵经验!我也会继续做各种数据测试对这个想法进行验证


本文转载自: https://blog.csdn.net/qq_42887496/article/details/136881137
版权归原作者 不要冗余 所有, 如有侵权,请联系我们删除。

“springboot项目中关系型数据库与mongoDB并用是否能提升性能?”的评论:

还没有评论