mongodb 单事务内使用多线程加速的简单例子

Posted 李昊轩的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb 单事务内使用多线程加速的简单例子相关的知识,希望对你有一定的参考价值。

事务内 如果有重复性比较强且线程安全的重复性循环操作.
可以考虑使用并行来替代循环

下面是java 操作 mongo 实现单事务内使用多线程的例子

package com.mindsuite.saas.ztest;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.ClientSession;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

@RestController
@RequestMapping("/test6")
public class test666 

    @GetMapping("/6")
    public Object testTodo() 

        //创建并发控制器
        int total = 5;
        CountDownLatch countDownLatch = new CountDownLatch(total);


        //获取线程池执行的实例(需要经过TtlExecutors修饰一下)
        Executor executor = Executors.newFixedThreadPool(total);

        //获取ClientSession
        MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://192.168.0.177:40000,192.168.0.177:40001,192.168.0.177:40002/test666?slaveOk=true&write=1&readPreference=secondaryPreferred"));
        ClientSession clientSession = mongoClient.startSession();
        MongoTemplate mainTemplate = new MongoTemplate(mongoClient, "test666").withSession(clientSession);


        try 
            //开启事务
            clientSession.startTransaction();


            HashMap<String, Object> tenant = new HashMap<>();
            tenant.put("name", "ksl");
            tenant.put("money", 1);

            mainTemplate.save(tenant, "tenant");

            for (int i = 0; i < total; i++) 

                //开启一个线程,执行任务处理
                executor.execute(() -> 
                    MongoTemplate subMongoTemplate = SelfMongoTemplate.getMongoDBTemplate("666").withSession(clientSession);

                    HashMap<String, Object> tenant2 = new HashMap<>();
                    tenant2.put("name", "ksl2");
                    tenant2.put("money", System.currentTimeMillis());

                    subMongoTemplate.save(tenant2, "tenant");


//
//                Update update1 = new Update();
//                update1.set("total_goods_num", rd.nextInt(100));
//
//                subMongoTemplate.updateFirst(query, update1, "bill");

                    countDownLatch.countDown();
                );
            
            countDownLatch.await();

            //提交事务
            clientSession.commitTransaction();
         catch (Exception e) 
            //撤销事务
            clientSession.abortTransaction();

            e.printStackTrace();
        

        return "ok";
    


以上是关于mongodb 单事务内使用多线程加速的简单例子的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 单事务内使用多线程加速的简单例子

mongodb 单事务内使用多线程加速的简单例子

是否可以使用多线程加速脚本?

MongoDB 即将支持跨文档事务

瞬间爆炸-MongoDB4.0将支持多文档事务

ET介绍——单线程异步