`

多线程从数据库中分页读,单线程将所有结果保存的数据库

    博客分类:
  • Java
阅读更多
public class OrderReadThread implements Runnable {

    private List<Map<String, Object>> orderList;
    private BaseDalClient dalClient;
    private Map<String, Object> params;
    private int totalRecords;
    private CyclicBarrier cyclicBarrier;

    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    public void run() {
        // 每个线程分页查询,最终将结果放入公共的orderList
        Page<?> pageInfo = dalClient.queryForListPage("eps.UserRegisterServiceImpl.selectOrderList", params,
                totalRecords);
        List tempList = pageInfo.getList();

        orderList.addAll(tempList);
        try {
            // 子线程执行结束,等待其他未执行完的线程,如果所有线程都执行结束即执行同步线程
            cyclicBarrier.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }

    public void setOrderList(List<Map<String, Object>> orderList) {
        this.orderList = orderList;
    }

    public void setDalClient(BaseDalClient dalClient) {
        this.dalClient = dalClient;
    }

    public void setParams(Map<String, Object> params) {
        this.params = params;
    }

    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }

    public void setCyclicBarrier(CyclicBarrier cyclicBarrier) {
        this.cyclicBarrier = cyclicBarrier;
    }

}



public class FileWriteTaskThread implements Runnable {

    private List<Map<String, Object>> orderList;

    public FileWriteTaskThread(List<Map<String, Object>> orderList) {
        this.orderList = orderList;
    }

    @Override
    public void run() {
        System.out.println("****************将所有子线程统计的最终的结果保存到文件中F*******************");

        String outFileName = "order" + getCurrentTimeStr() + ".txt";
        String outFilePath = "d:/order/" + outFileName;
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFilePath), "UTF-8"));
            for (Map<String, Object> order : orderList) {
                StringBuilder line = new StringBuilder(200);

                line.append(MapUtils.getString(order, "b2corderno", "")).append(",")
                        .append(MapUtils.getString(order, "phonenum", "")).append(",")
                        .append(MapUtils.getString(order, "customername", "")).append(",")
                        .append(MapUtils.getString(order, "customeraddress", "")).append(",")
                        .append(MapUtils.getString(order, "suppliercode", ""));

                bw.write(line.toString());
                bw.newLine();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bw != null) {
                IOUtils.closeQuietly(bw);
            }
        }

    }

    private String getCurrentTimeStr() {
        Date d = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        return format.format(d);
    }

}



 /**
     * 每次查询1000条
     */
    private static final int PERCENT_DOWNLOAD_NUM = 1000;

    public static void main(String[] args) {
        // 启动Spring容器
        ApplicationContext context = new FileSystemXmlApplicationContext(
                "file:src/main/webapp/WEB-INF/applicationContext.xml");
        // 获取数据库操作类
        BaseDalClient dalClient = context.getBean("dalClient", BaseDalClient.class);
        // 查询总记录数
        int totalRecords = dalClient
                .queryForObject("eps.UserRegisterServiceImpl.selectOrderCount", null, Integer.class);

        int temp = totalRecords / PERCENT_DOWNLOAD_NUM;
        int queryCount = (totalRecords % PERCENT_DOWNLOAD_NUM) != 0 ? temp + 1 : temp;

        List<Map<String, Object>> orderList = Collections.synchronizedList(new ArrayList<Map<String, Object>>());// 线程安全的List
        // 同步辅助类,当所有子线程全部执行结束后来执行不同辅助类指定的同步线程FileWriteTaskThread
        CyclicBarrier cyclicBarrier = new CyclicBarrier(queryCount, new FileWriteTaskThread(orderList));
        for (int i = 1; i <= queryCount; i++) {
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("pageSize", PERCENT_DOWNLOAD_NUM);
            params.put("page", i);

            OrderReadThread orderReadThread = new OrderReadThread();
            orderReadThread.setDalClient(dalClient);
            orderReadThread.setOrderList(orderList);
            orderReadThread.setParams(params);
            orderReadThread.setTotalRecords(totalRecords);
            orderReadThread.setCyclicBarrier(cyclicBarrier);

            // 启动多线程来从数据库中分页读取数据
            Thread thread = new Thread(orderReadThread);
            thread.start();
        }
    }
分享到:
评论

相关推荐

    oracle数据库设计规范.doc

    数据库连接类型选择 Oracle数据库有专用服务器连接类型和多线程服务器MTS连接类型。对于批处理服 务,需要专用服务器连接方式,而对于OLTP服务则MTS的连接方式比较合适。由于采 用MTS后,可以通过配置网络服务实现...

    易语言NetDB数据库操作中间件

    3、**还有就是读数据库不用多线程读了,在等待数据返回的期间不会卡客户端,另外自己用多线程会引发冲突 4、**修复客户端退出后,在登录用户服务端崩溃问题。 [2020-2-23] ================ 1、**数据库读取增加...

    易语言数据库中间件源码-易语言

    易语言数据库中间件,采用远程服务支持库!暂时木有采用HP,因为HP我本身还不熟悉...6、软件内部采用类的形式进行数据库处理,内部进行临界处理,支持多线程! 7、备注详实,关键地方都有相关的说明,代码也算整齐吧!

    Spring boot整合Mybatis实现增删改查

    项目基于Mysql自带的Sakila数据库实现了MIS系统中常用的多个功能,运行前请安装好Mysql8.0。 其中包含的内容如下: 1.Spring boot 2.1.6,Mybatis3.2.2的整合; 2.前端框架采用https://adminlte.io ,后台的分页...

    DBKING使用指南

    再比如获取数据库序列,我们采用了统一的算法,不同的数据库都使用同一个接口来获取序列,而且这个方法可以在多线程环境下使用,甚至是集群环境下都没有问题。  5、提供多种使用方式。可以单独使用,也可以结合...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例081 去掉字符串中的所有空格 101 实例082 汉字与区位码的转换 102 第5章 面向对象技术应用 103 5.1 Java中类的定义 104 实例083 自定义图书类 104 实例084 温度单位转换工具 105 实例085 域的默认初始化值 106 ...

    asp.net知识库

    如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然...

    Java面试宝典2010版

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     14.5.1 在数据库中对集合排序  14.5.2 在内存中对集合排序  14.6 映射组件类型集合  14.7 小结  14.8 思考题 第15章 映射实体关联关系  15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     14.5.1 在数据库中对集合排序  14.5.2 在内存中对集合排序  14.6 映射组件类型集合  14.7 小结  14.8 思考题 第15章 映射实体关联关系  15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     14.5.1 在数据库中对集合排序  14.5.2 在内存中对集合排序  14.6 映射组件类型集合  14.7 小结  14.8 思考题 第15章 映射实体关联关系  15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射 ...

Global site tag (gtag.js) - Google Analytics