首页 > 数据库 >java多线程把数据迁移到不同数据库中

java多线程把数据迁移到不同数据库中

时间:2024-07-26 20:58:33浏览次数:15  
标签:count Map java int 数据库 list 线程 new 多线程

public void sync_table_test_thread() throws SQLException, InterruptedException {
        long start = System.currentTimeMillis();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //获取要迁移oracle表数据库配置
        Connection connection = DruidJdbcUtils.getConnection("db0");
        Integer count = 0;
        PreparedStatement countStatement = connection.prepareStatement("select count (*) from Table \n");
        ResultSet countSet = countStatement.executeQuery();  //查询要迁移数据count总数
        while (countSet.next()) {
            count = countSet.getInt(1);//获取迁移数据count总数
            boolean next = true;
            try {
                if (count>0) {
                    try {
                        //设置20个线程 但是分开之后向下取整 那么可能会多一个
                        int threadCount = 20;//默认设置20个线程
                        int listSize = (int) Math.floor((double) count / threadCount) == 0 ? 1 : (int) Math.floor((double) count / threadCount);//设置每个线程执行多少条数据,总数据除以线程数=每个线程执行数
                        PreparedStatement preparedStatement = connection.prepareStatement("select * from TABLE \n");//查询并获取要迁移的总数据
                        ResultSet resultSet = preparedStatement.executeQuery();
                        ResultSetMetaData md = resultSet.getMetaData();//ResultSetMetaData获取列表字段数、字段参数
                        int colnum = md.getColumnCount();//获取列表字段数:如1行有10个参数值
                        List listOfRows = new ArrayList();
                        while (resultSet.next()) {
                            Map mapOfColValues = new HashMap(colnum);
                            for (int i = 1; i <= colnum; i++) {
                                if(md.getColumnName(i).equals("TABLE_CDATE")){
                                    mapOfColValues.put(md.getColumnName(i), resultSet.getDate(i)+" "+resultSet.getTime(i));//获取每条数据的参数名和参数值放到Map中 日期格式单独处理
                                }else{
                                    mapOfColValues.put(md.getColumnName(i), resultSet.getObject(i));//获取每条数据的参数名和参数值放到Map中
                                }
                            }
                            listOfRows.add(mapOfColValues);//把这条数据赋值后放到list中
                        }

                        Map<String, List> stringListHashMap = this.splitList(listOfRows, listSize);//listOfRows数据总数列表,listSize每份执行数量
                        threadCount = ((HashMap) stringListHashMap).size();//获取存入Map中string,list的份数:这里的话20份
                        final CountDownLatch latch = new CountDownLatch(threadCount);//线程记数器:这里是20个线程

                        for (HashMap.Entry<String, List> entry : stringListHashMap.entrySet()) {
                                Thread thread = new Thread(() -> {
                                    try {
                                        for (Object obj : entry.getValue()) {
                                            Map map = (Map) obj;

                                           //示例以3个字段为例子
                                            String tableUuid = (String) map.get("TABLE_UUID");
                                            String tableItemuuid = (String) map.get("TABLE_ITEMUUID");
                                            String tableCdate = (String) map.get("TABLE_CDATE");
                                            String tableCdate1;
                                            if (tableCdate != null && !"".equals(tableCdate)) {
                                                tableCdate1 = tableCdate;
                                            } else {
                                                tableCdate1 = null;
                                            }

                                            TableNew tableNew= new TableNew ();
                                            tableNew.setTableNewUuid(tableUuid);
                                            tableNew.setTableNewItemuuid(tableItemuuid);

                                            if (tableCdate1 != null && !"".equals(tableCdate1)) {
                                                tableNew.setTableNewCdate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(tableCdate1));
                                            } else {
                                                tableNew.setTableNewCdate(null);
                                            }

                                            tableNewDao.save(tableNew);//组装老数据到新数据表中
                                        }

                                    } catch (Exception throwables) {
                                        throwables.printStackTrace();
                                        //latch.countDown();
                                        System.out.println("数据操作失败");
                                    }finally {
                                        latch.countDown();
                                    }
                                });

                            ThreadUtil.execute(thread);
                            //latch.countDown();//线程执行完之后-1(这里总共20个,都执行完后就是0)
                        }

                        try {
                            latch.await();//唤醒主线程
                            long endTimes = System.currentTimeMillis();
                            System.out.println("所有数据推送执行完毕:" + (endTimes - start));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        preparedStatement.close();
                    } catch (SQLException throwables) {
                        throwables.printStackTrace();
                    }

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        countStatement.close();
        long end = System.currentTimeMillis();
        System.out.println("完成同步,耗时:" + (end - start) + "毫秒");
    }

public Map<String, List> splitList(List list, Integer num) { //list总条数(以10000条数据和20个线程为例子=500条/份),每份500
    int listSize = list.size(); //list 10000
    HashMap<String, List> stringListHashMap = new HashMap<String, List>(); //用户封装返回的多个list
    List stringlist = new ArrayList<>();
    for (int i = 0; i < listSize; i++) {   //for循环依次放入每个list中
        stringlist.add(list.get(i));       //先将string对象放入list,以防止最后一个没有放入
        if (((i + 1) % num == 0) || (i + 1 == listSize)) {               //如果l+1 除以 要分的份数 为整除,或者是最后一份,为结束循环.那就算作一份list,
            stringListHashMap.put("stringList" + i, stringlist); //将这一份放入Map中.
            stringlist = new ArrayList<>();      //新建一个list,用于继续存储对象
        }
    }
    return stringListHashMap;                                     //将map返回
}

标签:count,Map,java,int,数据库,list,线程,new,多线程
From: https://blog.csdn.net/Q_L_D_X_K/article/details/140692633

相关文章

  • 学习Java的第十一天啦(2024.7.26)
    1.死锁的条件:死锁的产生还涉及到一些具体的条件,这些条件可以被看作是死锁产生的必要条件,包括:1.互斥条件:资源不能被多个进程或线程同时访问,即资源是互斥的。2.请求保持条件:进程或线程在请求资源时,已经持有其他资源,并且不愿意释放已经持有的资源。3.不可剥夺条件:已经分配给进......
  • [Java基础]Finally
    finally中的代码一定会执行吗?通常在面试中,只要是疑问句一般答案都是“否定”的,因为如果是“确定”和“正常”的,那面试官就没有必要再问了嘛,而今天这道题的答案也是符合这个套路。1.典型回答正常运行的情况下,finally中的代码是一定会执行的,但是,如果遇到以下异常情况,那么finall......
  • JAVA集中学习第二周学习记录(四)
    系列文章目录第一章JAVA集中学习第一周学习记录(一)第二章JAVA集中学习第一周项目实践第三章JAVA集中学习第一周学习记录(二)第四章JAVA集中学习第一周课后习题第五章JAVA集中学习第二周学习记录(一)第六章JAVA集中学习第二周项目实践第七章JAVA集中学习第二......
  • [Java面向对象]final
    final简介[2]final关键字可用于多个场景,且在不同场景具有不同的作用。首先,final是一个非访问修饰符,仅适用于变量,方法或类。下面是使用final的不同场景:java中的final关键字上面这张图可以概括成:当final修饰变量时,被修饰的变量必须被初始化(赋值),且后续不能修改其值,实质上是常......
  • JAVA集中学习第二周项目实践[图书管理系统]
    系列文章目录第一章JAVA集中学习第一周学习记录(一)第二章JAVA集中学习第一周项目实践第三章JAVA集中学习第一周学习记录(二)第四章JAVA集中学习第一周课后习题第五章JAVA集中学习第二周学习记录(一)第六章JAVA集中学习第二周项目实践文章目录系列文章目录......
  • python和mysql数据库
    pyhton和mysql数据库1.非查询:frompymysqlimportConnection#导入数据库模块pymysql以及Connection对象conn=Connection(#连接数据库  host='127.0.0.1',#ip地址或者是主机名  port=3306,#端口号  user='root',  password='20040130', ) cursor=c......
  • [Java并发]
    多线程的价值(这里展示的是网上的答案,我觉得真正重要的是减少进程切换的代价)发挥多核CPU的优势多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的,采用多线程的方式去同时完成几件事而不互相干扰。防止阻塞从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的......
  • java位运算
    位运算符:针对二进制的值补码形式进行计算的&|^(相同为0,不同为1)~<<>>>>>publicclassWeiOptDemo1{publicstaticvoidmain(String[]args){bytea1=3;byteb1=4;System.out.println(a1&b1);System.out.println(a1|b1);System.o......
  • 讨论异步与多线程的关系及区别
    在面试中讨论异步与多线程的关系及区别时,可以从以下几个方面来阐述:关系:并行性:多线程和异步编程都是为了提高程序的并发能力。在某些情况下,异步操作可以通过多线程的方式来实现。应用场景:当需要处理耗时的操作(如I/O操作、网络请求等)时,可以使用异步编程来避免阻塞主......
  • java 06
    输入:引入scannerimportjava.util.ScannerScannerscanner=newScanner(System.in)Stringname=mySanneer.nextInt()//输入内容在命令框输入Javainput进制:十进制转二进制:不断除以2最后将余数倒着拍;转8转16相似;位运算:1>>2:1向右位移两位;1<<2左移2原码反码补码:如......