
一.引入pom.xml
org.springframework.boot spring-boot-starter-data-mongodbcom.spring4all mongodb-plus-spring-boot-starter1.0.0.RELEASE
二.application.yml添加配置
spring:
data:
mongodb:
uri: mongodb://username:password@localhost:27017/dbname?authSource=collectionname
三.测试
1.测试添加:将20万条数据通过线程池,分10个线程,每个线程2000条数据保存,通过mongoTemplate批量并行存储。
@Test
public void testAdd() {
Stopwatch stopwatch = Stopwatch.createStarted();
DateTime date = DateUtil.date();
//2.配置线程池,去分批次组装HomsPubInfo;
int batchNum = 2000;
int totalNum = 200000;
int pageNum = totalNum % batchNum == 0 ? totalNum / batchNum : totalNum / batchNum + 1; //总数据数去根据线程数切块;
ExecutorService executorService = Executors.newFixedThreadPool(pageNum);
try {
CountDownLatch countDownLatch = new CountDownLatch(pageNum);
int fromIndex;
int toIndex;
for (int i = 0; i < pageNum; i++) {
fromIndex = i * batchNum;
toIndex = Math.min(fromIndex + batchNum, totalNum);
HandleTask handleTask = new HandleTask(countDownLatch, fromIndex, toIndex, date);
executorService.execute(handleTask);
}
// 主线程必须在启动其它线程后立即调用CountDownLatch.await()方法,这样主线程的操作就会在这个方法上阻塞,直到其它线程完成各自的任务。
// 计数器的值等于0时,主线程就能通过await()方法恢复执行自己的任务。
countDownLatch.await(10, TimeUnit.MINUTES);
stopwatch.stop();
log.info("10个线程,存储10W条数据耗时:{}", stopwatch.toString());
log.info("********************** 数据操作完成,进入主线程执行代码 ***************************");
} catch (Exception e) {
e.printStackTrace();
}
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public class HandleTask implements Runnable {
private CountDownLatch countDownLatch;
private int fromIndex;
private int toIndex;
private DateTime date;
@Override
public void run() {
// 业务逻辑,例如批量insert或者update
date.offset(DateField.SECOND, 1);
List columnList = make100Field();
List
2.测试检索
@Test
public void testSearch() {
Stopwatch stopwatch = Stopwatch.createStarted();
Query query = new Query().addCriteria(
Criteria.where("c1").gte("2021-10-16 15:28:42").lte("2021-10-16 15:58:46"));
List