Mongodb服务器信息前端
8核16Gjava
开发台式机信息web
固态硬盘、公司内部网络redis
示例代码spring
1.采用jdk1.8 + springboot2.1.6 + mongodb3.8.2组合而成的工程示例sql
2.mongodb4.0.11全部过程采用默认安装,没作特殊优化mongodb
3.测试表,只有主键,ID不自动生成数据库
mongodb.sqlapi
db.getCollection('DbResult').insert({'_id':1,content:'test'});
pom.xml缓存
<!-- springboot框架包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 导入mongodb包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
application.properties
#tomcat address port server.port=8089 server.address=127.0.0.1 server.sessionTimeout=30 spring.application.name=demo-web #2.0 path server.servlet.context-path=/api #采用logback.xml配置日志输出模板 logging.config=classpath:logback.xml #springframework.web框架的日志级别,注意与自已代码中定义的日志级别不同 logging.level.org.springframework.web:INFO #是否启用springboot的debug调试模式,会打印详细日志信息 debug=false #mongodb datasource spring.data.mongodb.host=192.168.110.01 spring.data.mongodb.port=27017 spring.data.mongodb.authentication-database=mydemo spring.data.mongodb.database=mydemo spring.data.mongodb.username=root spring.data.mongodb.password=123456
Result.java
@Data @Document(collection = "DbResult") public class Result { @Id private long id; private String content; }
ResultDao.java
@Repository("mongoResultDao") public class ResultDao { @Autowired private MongoTemplate mongoTemplate; /** * 新增数据 * @param result */ public void insert(Result result){ mongoTemplate.insert(result); } /** * 批量新增数据 * @param resultList */ public void insertResultBatch(List<Result> resultList){ mongoTemplate.insert(resultList, Result.class); } }
ResultService.java
@Service("mongoResultService") public class ResultService { @Resource private ResultDao resultDao; /** * 新增数据 * @param result */ public void insert(Result result){ resultDao.insert(result); } /** * 批量新增数据 * @param resultList */ public void insertResultBatch(List<Result> resultList){ resultDao.insertResultBatch(resultList); } }
ResultApi.java
@RestController("mongoResultApi") @RequestMapping("/mongo/result") public class ResultApi { @Resource private ResultService mongoResultService; /** * 批量添加新的对象 * @return */ @RequestMapping(value = "/batAdd", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public Object batAdd(){ Result result = null; String content = System.currentTimeMillis() + ""; long startTime = System.currentTimeMillis(); for (int i=1001;i<=1001000;i++){ result = new Result(); result.setId(i); result.setContent(content); mongoResultService.insert(result); } ApiResult result1 = new ApiResult(); result1.setData(System.currentTimeMillis() - startTime); return result1; } /** * 批量添加新的对象 * @return */ @RequestMapping(value = "/batAddList", method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public Object batAddList(){ Result result ; long startTime = System.currentTimeMillis(); String content = startTime + ""; List<Result> resultList = new ArrayList<>(1000); for (int i=10001;i<=1010000;i++){ result = new Result(); result.setId(i); result.setContent(content); resultList.add(result); if (resultList.size() == 1000){ mongoResultService.insertResultBatch(resultList); resultList.clear(); } } ApiResult result1 = new ApiResult(); result1.setData(System.currentTimeMillis() - startTime); return result1; } }
注:ApiResult 是内部封装的向前端响应的实体对象,主要有三个变量:code,msg,data
AppStart.java
@SpringBootApplication @EnableAutoConfiguration public class AppStart { public static void main(String[] args) { SpringApplication.run(AppStart.class,args); } }
测试结果
-- mongodb -- 单条插入1000条 { "code": "1", "msg": "", "data": 5025 } -- 单条插入100万条 { "code": "1", "msg": "", "data": 1230669 } -- 清除历史数据 -- 批量插入1000条 { "code": "1", "msg": "", "data": 26 } -- 批量插入1万条 { "code": "1", "msg": "", "data": 255 } -- 批量插入100万条 { "code": "1", "msg": "", "data": 25650 }
数据统计
累计入库总记录数
测试库总大小
总结
100万条记录一条一条的插入到数据集合中,须要耗时约 20分钟 =(1230669/ 1000 / 60),入库速度偏慢;
100万条记录每1000条为一批的方式插入到数据集合中,须要耗时约 25秒 = (25650/ 1000),速度很快;
涉及到大批量数据插入到数据库集合中,建议因采用批量插入方式,才能发挥数据库的最大潜力,在特殊的业务场景上,若是插入操做多,读入操做少,能够采用队列的方式,先收集数据缓存(如缓存内存中,redis等),当队列达到必定量后,再批量插入到数据库中(要求实时性强,数据重要等除外);