首页 > 数据库 >mongoDB的应用场景以及Spring和mongodb的整合

mongoDB的应用场景以及Spring和mongodb的整合

时间:2022-11-23 19:07:01浏览次数:43  
标签:存储 Spring public Person mongodb mongoDB 日志 id

mongoDB的应用场景

​ mongodb是非关系型数据库,他的存储数据可以超过上亿条(老版本的mongodb有丢数据的情况,新版本不会有,网上说的),mongodb适合存储 一些量大表关系较简单的数据,例如用户信息,用户注册信息,公司注册信息,留言,评论,操作日志,mongodb还能用分布式文件存储信息,我们主要用mongodb来存储我们项目里面的操作日志(银行的付款转账记录,角色权限的变动日志),我们主要是结合aop来使用的,首先我们来配置一个aop的切面类,再给aop的使用规则,哪个类里面的哪个方法使用当前切面类,利用后置通知类获取当前方法的操作日志,将操作日志存储到mongodb,然后进行分类管理查看。利用后置通知传到数据库。

​ 从目前阿里云 MongoDB 云数据库上的用户看,MongoDB的应用已经涉及到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,之所以采用mongodb是因为:

​ MongoDB是NoSQL的非关系型数据库,他的存储数据可以超过上亿条(老版本的mongodb有丢数据的情况,新版本不会有,网上说的),mongodb适合存储 一些量大表关系较简单的数据,易于扩展,可以进行分布式文件存储,适用于大数据量、高并发、弱事务的互联网应用,

以下是几个实际的应用案例:

  • 游戏场景,使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新

  • 物流场景,使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。

  • 社交场景,使用MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能

  • 物联网场景,使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析

  • 视频直播,使用MongoDB存储用户信息、礼物信息等

在我们实际项目中:

  1. 我们主要用mongodb来存储我们项目里面的操作日志(银行的付款转账记录,角色权限的变动日志),我们主要是结合aop来使用的,首先我们来配置一个aop的切面类,再给aop的使用规则,哪个类里面的哪个方法使用当前切面类,利用后置通知类获取当前方法的操作日志,将操作日志存储到mongodb,然后进行分类管理查看。利用后置通知传到数据库。

  2. 我们在项目中使用它来存储电商产品详情页的评论信息(评论id,商品id,标题,评分,内容,评论人信息,评论的发布时间,评论标签组)并且为了提高可用性和高并发用了3台服务器做了mongodb的副本集,其中一台作为主节点,另外两台作为副本节点,这样在任何一台mongodb服务器宕机时就会自动进行故障转移,不会影响应用程序对mongodb的操作,为了减轻主节点的读写压力过大的问题,我还对mongodb副本集做了读写分离,使写操作在主节点进行,读取操作在副本节点进行。为了控制 留言,我们留言的界面设置在了订单状态,只有状态为5,也就是交易成功收货后才能评论,并在评论成功后将订单状态改为6

【补充:如果问到副本集是怎么搭建的,就说我们有专门的运维人员来负责搭建,我只负责用Java程序去进行操作】

MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。

在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。

副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的)

Spring和mongodb整合步骤:

1.添加依赖的jar包

要想整合Spring和Mongodb必须下载相应的jar,这里主要是用到两种jar一种是spring-data-document和spring-data-commons两种类型的jar

2.定义实体类

3.Spring配置

新建application.xml配置文件

这个必须要的引入mongodb标签xmlns:mongo="http://www.springframework.org/schema/data/mongo"

在配置文件中加入链接mongodb客服端

<mongo:mongo host="localhost" port="27017">  

</mongo:mongo> 

注入mogondb的bean对象

  <bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemp">  

   <constructor-arg ref="mongo"/>  

   <constructor-arg name="databaseName" value="db"/>  

   <constructor-arg name="defaultCollectionName" value="person" />  

  </bean>  

  <bean id="personRepository" class="com.mongo.repository.PersonRepository">  

​    <property name="mongoTemplate" ref="mongoTemplate"></property>  

 </bean>  

4.然后编写操作mongodb增删查改的接口

  public interface AbstractRepository {  

   public void insert(Person person);  

   public Person findOne(String id);  

   public List<Person> findAll();  

   public List<Person> findByRegex(String regex);  

   public void removeOne(String id);  

   public void removeAll();  

   public void findAndModify(String id);  

 }  

再写对应接口的实现类:

 import java.util.List;  

 import java.util.regex.Pattern;    

 import org.springframework.data.document.mongodb.MongoTemplate;  

 import org.springframework.data.document.mongodb.query.Criteria;  

 import org.springframework.data.document.mongodb.query.Query;  

 import org.springframework.data.document.mongodb.query.Update;  

  

 import com.mongo.entity.Person;  

 import com.mongo.intf.AbstractRepository;  

  

 public class PersonRepository implements AbstractRepository{  

   private MongoTemplate mongoTemplate;  

   @Override  

   public List<Person> findAll() {  

​     return getMongoTemplate().find(new Query(), Person.class);  

   }  

  

   @Override  

   public void findAndModify(String id) {  

​    getMongoTemplate().updateFirst(new Query(Criteria.where("id").is(id)), new Update().inc("age", 3)); 

   }  

​    @Override  

   public List<Person> findByRegex(String regex) {  

​     Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);  

​     Criteria criteria = new Criteria("name").regex(pattern.toString());       return getMongoTemplate().find(new Query(criteria), Person.class);     }  

​    @Override  

   public Person findOne(String id) {  

​     return getMongoTemplate().findOne(new Query(Criteria.where("id").is(id)), Person.class);  

   }  

​    @Override  

   public void insert(Person person) {  

​     getMongoTemplate().insert(person);  

   }  

​    @Override  

   public void removeAll() {  

​     List<Person> list = this.findAll();  

​     if(list != null){  

​       for(Person person : list){  

​         getMongoTemplate().remove(person);  

​       }  

​     }  

   }  

  

   @Override  

   public void removeOne(String id){  

​     Criteria criteria = Criteria.where("id").in(id);  

​     if(criteria == null){  

​        Query query = new Query(criteria);  

​        if(query != null && getMongoTemplate().findOne(query, Person.class) != null)  

​     getMongoTemplate().remove(getMongoTemplate().findOne(query, Person.class));       }

   }  

  

   public MongoTemplate getMongoTemplate() {  

​     return mongoTemplate;  

   }  

​     public void setMongoTemplate(MongoTemplate mongoTemplate) {  

​     this.mongoTemplate = mongoTemplate;  

   }

}

5.实现类注入到service层调用

标签:存储,Spring,public,Person,mongodb,mongoDB,日志,id
From: https://blog.51cto.com/codeshallow/5879306

相关文章

  • Spring Data(数据) Couchbase
    版本5.0.0本参考文档描述了SpringDataCouchbase库的一般用法。项目信息版本控制-https://github.com/spring-projects/spring-data-couchbase错误跟踪器-https://jir......
  • SpringCloud入门
    一、SpringCloud简介与版本选择1、简介SpringCloud是一系列框架的集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心......
  • Spring mvc
    SpringMVCMVC:模型(daoservice)视图jsp控制器ServletSpringMVC的特点:轻量级,简单易学高效,基于请求响应的MVC框架与Spring兼容性好,无缝结合约定优于配置功能强......
  • spring-security
    springSecurity设置用户名和密码一.配置文件中设置springl.security.user.name=xxxspring.security.user.password=xxx二.配置类中设置@Configurationpublicclass......
  • springBoot
    说说你对mvc的理解 MVC是一种设计模式,在这种设计模式下软件被分为了3层:model、view、controller;model层主要是定义实体对象等数据,封装了数据和对数据的操作,是实际进行数据......
  • SpringSecurity登录时报错栈溢出,StackOverflow,SpringSecurity多端登录实现方案
    最近在用springsecurity做一套医疗项目,要求一套后端对应两套前端界面,用户(患者)和医生。先写的用户登录界面,没有问题,再用同样方法写医生登录的时候报错栈溢出stackoverfl......
  • Spring 数据转换器
    版本2.7.61.依赖关系由于各个Spring数据模块的开始日期不同,因此它们中的大多数都带有不同的主要和次要版本号。找到兼容版本的最简单方法是依靠我们随附的与定义的兼容......
  • Mongodb更新操作
    MongoDB提供以下方法来更新集合中的文档:update:更新或替换匹配指定过滤器的单个文档,或更新与指定过滤器匹配的所有文档,要更新多个文档,请使用multi选项。updateOne:更新单个......
  • MongoDB查询
    //返回的字段ProjectionOperationprojectionOperation=Aggregation.project("user_isp_tag","ad_title","ad_id","push_url","clicksum");......
  • Spring Boot 多数据源配置
    第一种方式:AbstractRoutingDataSource1.1.手动切换数据源application.properties#Order#如果用Druid作为数据源,应该用url属性,而不是jdbc-urlspring.datasource.o......